4

の最初のインスタンスの前にあるすべての文字を削除したいファイル名のリストがあります-。そのため、Before: リストの下にある名前は、After: リストの名前として表示されます。

Before:
Adam James - Welcome Home.txt
Mike & Harry - One Upon - A Time.txt
William-Kent - Prince & The Frog.txt

After:
Welcome Home.txt
One Upon - A Time.txt
Prince & The Frog.txt

私は無駄に何時間もsedで遊んでいます。

sed 's/ - .*//'の最初のインスタンスの後にすべての文字を削除することがわかりまし-たが、以前は同じものを見つけることができません。

4

8 に答える 8

3

awk を使用すると、次のことができます。

awk 'BEGIN{FS=OFS="- "} NF>1{$1="";sub(/^- */, "")}'1 inFIle

ライブデモ: http://ideone.com/2tBU4v

于 2013-04-24T20:15:28.913 に答える
2

これは、bash 機能を使用せずに、プレーンな POSIX sh で実行できます。

$ cat the_file_names 
Adam James - Welcome Home.txt
Mike & Harry - One Upon - A Time.txt
William-Kent - Prince & The Frog.txt

$ { while read FN; do echo ${FN#* - }; done; } < /tmp/the_file_names 
Welcome Home.txt
One Upon - A Time.txt
Prince & The Frog.txt

$ 
于 2013-04-24T21:08:30.567 に答える
1

これはうまくいくかもしれません(GNU sed):

 sed 's/ - /\n/;s/.*\n//' file
于 2013-04-25T06:22:29.747 に答える