特定の値(-)を使用して文字列を削除する

特定の値(-)を使用して文字列を削除する

次のテキストがあります。

foo-11.11-fo.o-foo-bar

バー-フー-11.11-22.11

2つの "-"を持つ最後の文字列を削除したいと思います。

予想出力:

foo-11.11-fo.o

バー金持ち

Cutを使用するいくつかの方法を試しましたが、何も機能しません。

答え1

使用sed:

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

-X-Xこれにより、各行の末尾に含まれていないfile文字列が削除されます。X-

文字列がシェル変数にある場合:

$ 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配列のすべての要素に対して削除が実行されます。

答え2

$ 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最初の2つのフィールドを除くすべてのフィールドを選択します。


も使用できますが、perl入力行にフィールドが3つ未満の場合は空白行が印刷されます。

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

入力区切り記号として指定し、-最後の2つのフィールドを除くすべてのフィールドを印刷します。

関連情報