Hogyan lehet elkerülni egy karakter karakteres karakterét?

Feltételezve, hogy a $file fájlnév értéke van, mondjuk: Dr" A.tif. A bash programozásban hogyan kerülhetném el az egyetlen idézetet és a $file bármely más karakterét a speciális karakter eltávolítása nélkül?

Frissítés 2014. július 9-én

Mint kérés a @Gilles-től , a következő kódrészlet, amely nem képes kezelni az Dr" A.tif -t:

files=$(find /path/ -maxdepth 1 -name "*.[Pp][Dd][Ff]" -o -name "*.[Tt][Ii][Ff]") echo "${files}" > ${TEMP_FILE} while read file do newfile=$(echo "${file}" | sed "s, ,\\ ,g") ## line 1 done < ${TEMP_FILE} 

Miután kipróbáltam a válasz a @Patrick oldalról a line 1 oldalon, úgy tűnik, hogy nekem működik. De ha van olyan fájlom, mint például Dr\^s A.tif, printf parancs nem tűnik segítségnek, nekem megmutatja Dr\^s\ A.tif. Ha manuálisan kipróbálom az ilyen konzolon:

printf "%q" "Dr\^s A.tif"

Ez a kimenet lesz:

Dr\\\^s\ A.tif

Van ötlet, hogyan kell ezt kezelni?

Megjegyzések

  • miben kontextusban a $ file használatát várja? vagy ez a probléma hozzárendeli a karakterláncot a speciális karakterrel a $ fájlhoz?
  • Tulajdonképpen a find parancs egy fájlfájl tömböt ad vissza nekem. Ezután végigviszem ezt a fájllistát a $ fájl változóba.
  • Ön ‘ itt kapott néhány helyes választ, de valószínűleg nem ezek a válaszok kérdés, amelyet ‘ valóban feltesz. Az itteni megjegyzésed alapján erősen gyanítom, hogy ‘ rossz úton jársz. ‘ nem tudunk sokat segíteni, mert folyamatosan nem jeleníti meg a kódját. Azt javaslom azonban, hogy olvassa el a cikket. Miért fojtja el a shell szkript a szóközöket vagy más speciális karaktereket? háttérként. Mutassa meg a szkriptet, és magyarázza el, mit szeretne csinálni.

Válasz

Ön ennek megvalósításához felhasználhatja a printf beépített %q t. Például:

$ file="Dr" A.tif" $ printf "%q\n" "$file" Dr\"\ A.tif $ file=" foo$bar\baz`" $ printf "%q\n" "$file" \ foo\$bar\\baz\` 

Az printf alapdokumentációjából:

In addition to the standard format specifications described in printf(1) and printf(3), printf interprets: %b expand backslash escape sequences in the corresponding argument %q quote the argument in a way that can be reused as shell input %(fmt)T output the date-time string resulting from using FMT as a format string for strftime(3) 

Megjegyzések

  • Ez nem működik ‘ bizonyos esetekkel .eg amikor meg kell őriznie a dupla idézőjeleket.
  • @ user3467349 ez idézőjelekkel remekül működik.

fogadok, hogy fogadok ‘ olyasmit, mint például:printf '%s' "foo". Először meg kell értenie, hogyan működik az argumentumelemzés a shellben. Lásd:

gnu.org/software/bash/manual/bash.html#Shell-Operation # 2 # 6 előtt történik.

  • adjon példát erre a karaktersorozatra printf és más manipulációk nélkül nyomtatva It doesn't have a: ""
  • Az Ön problémájának semmi köze printf. A problémád az, hogy nem akarod ‘ azt, hogy a héj elemezze a húrodat. Ehhez meg kell adnia a bemenetet a shellnek oly módon, hogy az még ‘ meg sem próbálja elemezni. Ennek egyik módja a read -r -p 'input: ' && printf '%q\n' "$REPLY" lehet, és akkor adja meg a bemenetet, amikor a rendszer kéri.
  • Ahogy azt i ‘ ve mondtam most már többször. Ha nem tudod, hogyan továbbítsd a nyers adatokat a héjhoz, ez nem ‘ probléma az printf problémával. Talán inkább kérdést kellene feltenned, mintsem olyan megoldást kritizálnod, amelynek semmi köze nincs a problémádhoz.
  • Válasz

    Próbálja: –

    file=Dr\"\ A.tif echo $file Dr" A.tif 

    vagy

    file="Dr" A.tif" echo $file Dr" A.tif 

    vagy ha a karakterlánc kettős elemet tartalmaz idézet: –

    file="Dr" A.tif" echo $file Dr" A.tif 

    A szökésről és az idézésről jó útmutatók vannak a neten. Kezdje ezzel .

    Válasz

    Nem “Nem kell elmenekülnie minden olyan fájlnévtől, amelyet egy szkriptben kezel. Menekülésre csak akkor van szükség, ha egy fájlnevet literál ként akar beilleszteni egy szkriptbe, vagy több fájlnevet szeretne átadni egyetlen fájlként. bemeneti adatfolyamot egy másik szkriptbe.

    Mivel a find kimenetén keresztül haladsz, ezt az egyik legegyszerűbb módszer (!) a minden lehetséges út kezelésére :

    while IFS= read -r -d "" do file_namex="$(basename -- "$REPLY"; echo x)" file_name="${file_namex%$"\nx"}" do_something -- "$file_name" done <(find "$some_path" -exec printf "%s\0" {} +) 

    Válasz

    gyors és (nagyon) piszkos

    find . | sed "s/^/"/" | sed "s/$/"/" 

    Válasz

    Sok ilyen válasz, beleértve a legjobban szavazottat is a printf "%q" használatával nem minden esetben működik további manipuláció nélkül.A következőket javasolnám (az alábbi példa):

    cat <<EOF; 2015-11-07T03:34:41Z app[postgres.0000]: [TAG] text-search query doesn"t contain lexemes: "" EOF

    Megjegyzések

    • Mentség az n00b kérdésre, de részletesen leírnád, hogyan használnád ezt valójában a karakterek elkerülésére egy karakterláncban? Ha átmásolom az általad írt kódot a terminálomba, akkor az csak kiírja lexémákat tartalmaznak: ” ” … semmi sem kerülhető el.
    • Ez ‘ a szó szoros értelmében a lényeg, az összes speciális karaktert szó szerinti karakterként értelmezzük, nem a különleges jelentésük miatt. Próbáld meg inkább visszhangozni ” a fenti karakterláncot “, hogy lássa a különbséget.

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük