Shell-Script

使用某些值刪除字元串 (-)

  • September 25, 2017

我有以下文字

foo-11.11-fo.o-foo-bar

酒吧富-11.11-22.11

我想刪除最後一個有兩個“-”的字元串。

預期輸出:

foo-11.11-fo.o

酒吧富

我嘗試了多種使用 cut 的方法,但沒有任何效果。

$ cat ip.txt 
foo-11.11-fo.o-foo-bar
bar-foo-11.11-22.11

$ rev ip.txt
rab-oof-o.of-11.11-oof
11.22-11.11-oof-rab

$ rev ip.txt | cut -d- -f3- | rev
foo-11.11-fo.o
bar-foo

反轉每一行,然後使用cut選擇除前兩個以外的所有欄位,然後再次反轉輸出

您也可以使用perl, 但如果任何輸入行少於 3 個欄位,則會列印空行

$ perl -F'-' -lane 'print join "-", @F[0..$#F-2]' ip.txt 
foo-11.11-fo.o
bar-foo

指定-為輸入分隔符,然後列印除最後兩個欄位之外的所有欄位

使用sed

$ sed 's/-[^-]*-[^-]*$//' file
foo-11.11-fo.o
bar-foo

這將刪除-X-X中每一行的末尾file,其中X任何字元串不包含-.

如果字元串在 shell 變數中:

$ s='foo-11.11-fo.o-foo-bar'
$ printf '%s\n' "${s%-*-*}"
foo-11.11-fo.o

$ s='bar-foo-11.11-22.11'
$ printf '%s\n' "${s%-*-*}"
bar-foo

或在bash數組中:

$ s=( 'foo-11.11-fo.o-foo-bar' 'bar-foo-11.11-22.11' )
$ printf '%s\n' "${s[@]%-*-*}"
foo-11.11-fo.o
bar-foo

這會通過後綴模式匹配/刪除來刪除-*-*與變數中字元串末尾的模式匹配的任何內容。s在數組中的情況下s,刪除是在數組的所有元素上完成的。

引用自:https://unix.stackexchange.com/questions/394305