次のテキストがあります。
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つのフィールドを除くすべてのフィールドを印刷します。