Shell-Script
使用某些值刪除字元串 (-)
我有以下文字
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
,刪除是在數組的所有元素上完成的。