it-swarm.com.de

Wie entkomme ich Sonderzeichen in einer Zeichenfolge?

Angenommen, $file Enthält einen Wert für einen Dateinamen, sagen Sie Dr' A.tif. Wie kann ich bei der Bash-Programmierung einem einfachen Anführungszeichen und einem anderen Sonderzeichen des $file Entgehen, ohne das Sonderzeichen zu entfernen?

Update am 9. Juli 2014

Als Anfrage von @Gilles , folgendes Code-Snippet, das Dr' A.tif Nicht verarbeiten kann:

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}

Nachdem ich die Antwort von @Patrick auf line 1 Ausprobiert habe, scheint es für mich zu funktionieren. Aber wenn ich eine Datei wie Dr\^s A.tif Habe, scheint der Befehl printf keine Hilfe zu sein, sondern zeigt mir Dr\^s\ A.tif. Wenn ich es manuell auf der Konsole wie folgt versuche:

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

Ich werde diese Ausgabe haben:

Dr\\\^s\ A.tif

Irgendeine Idee, wie man damit umgeht?

17
huahsin68

Sie können das mit %q Eingebaute printf verwenden, um dies zu erreichen. Zum Beispiel:

$ file="Dr' A.tif"
$ printf '%q\n' "$file"
Dr\'\ A.tif

$ file=' foo$bar\baz`'
$ printf '%q\n' "$file"
\ foo\$bar\\baz\`

Aus der Bash-Dokumentation zu printf:

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)
14
Patrick

Versuchen:-

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

oder

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

oder wenn die Zeichenfolge ein doppeltes Anführungszeichen enthält: -

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

Es gibt gute Tutorials zum Entkommen und Zitieren im Internet. Beginnen Sie mit diesem .

4
garethTheRed

Sie müssen keine Dateinamen maskieren, die Sie in einem Skript verarbeiten. Das Escaping ist nur erforderlich, wenn Sie einen Dateinamen als Literal In ein Skript einfügen oder mehrere Dateinamen als einzelnen Eingabestream an ein anderes Skript übergeben möchten.

Da Sie die Ausgabe von find durchlaufen, ist this eine der einfachsten Möglichkeiten (!), mit jedem möglichen Pfad umzugehen. ::

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' {} +)
1
l0b0

schnell und (sehr) schmutzig

find . | sed 's/^/"/' | sed 's/$/"/'
0
Michael