2017-07-20 1 views
1

Ich habe eine Textdatei, die Dateinamen und Etiketten enthält dazuWie bekomme ich alle Zeichen außer dem letzten in einem Bash-Skript?

Dateien

Beispiel String:
0-3081031014094495-0.png 0

ich diesen Befehl bin mit über die Textdatei zu durchlaufen und letzte Zeichen erhalten.

while IFS= read -r line; do 
    echo $line | tail -c 2 
done <$PWD/$i/caffe/test.txt 

Ich möchte auch alles vor dem letzten Zeichen zu bekommen. So etwas wie echo $line | head -c -2 die ich interpretieren als: Start von Anfang an und bekommen alles, bis die beiden letzten Zeichen

Edit:

Danke für so viele wirklich schnelle Antworten. Etwas, das ich in der ursprünglichen Frage nicht erwähnt habe, war, dass ich einen Mac benutze. Ich dachte, es wäre egal, aber wenn du einige deiner Antworten ausprobierst, wurde mir klar, dass es darauf ankommt.

Zum Beispiel mit negativen Teilstrings ist not supported auf Mac. James Brown Lösung war die erste, die für mich arbeitete, deshalb habe ich seine Antwort akzeptiert.

+0

_get letzte char_ - - _also - - Holen Sie alles vor dem letzten char_ Also, was ist die erwartete Ausgabe für diesen Eingang? –

+0

Zeigen Sie uns eine minimale Beispieleingabe (Datei) und die erwartete Ausgabe benötigt – Inian

+0

Meine erwartete Ausgabe mit dieser wird eine Datei sein, wo ich die zwei Teile neu anordnen und einige andere Informationen hinzufügen werde. –

Antwort

3

zu bekommt alles vor dem letzten Zeichen in bash:

$ foo="0-3081031014094495-0.png 0" 
$ echo ${foo%?} 
0-3081031014094495-0.png 

Von http://tldp.org/LDP/abs/html/string-manipulation.html:

$ {string% String}

Löscht kürzestes Spiel von $ Teilzeichenfolge von der Rückseite des $ string .

0

von man head und man tail

# head 
    -c, --bytes=[-]K 
      print the first K bytes of each file; with the leading `-', print all but the last K bytes of each file 

# tail 
    -c, --bytes=K 
      output the last K bytes; alternatively, use -c +K to output bytes starting with the Kth of each file 

Beispiele

$ tail -c -2 <<< 'hello world!' 
! 
$ head -c -2 <<< 'hello world!'; echo 
hello world 

jedoch letzte Zeichen und alles außer letztem Zeichen können effiziente Expansion mit Shell

$ line='hello world!' 
$ echo "${line:${#line}-1}" 
$ echo "${line:0:${#line}-1}" 
2

werden erhalten Wenn Sie Ihre Eingabe ist Leerzeichen getrennt und die Dateinamen dürfen nicht enthalten sein in Räumen reicht read alleine aus.

while read -r filename label; do 
    printf "filename: %s label: %s\n" "$filename" "$label" 
done <"$PWD/$i/caffe/test.txt" 
0

wäre die einfachste Lösung rev zu benutzen (1), dh:

$ echo "$line" | rev | cut -c 1 | rev 
0 

Sie auch Zeilenlänge zu schneiden, dh passieren kann:

$ echo "$line" | cut -c ${#line} 
0 

Oder zu schneiden wenige letzte Zeichen:

$ echo "$line" | cut -c $((${#line} - 2))- 
g 0 
Verwandte Themen