sed - 删除破折号前的所有字符

时间:2013-04-24 20:03:29

标签: bash sed awk

我有文件列表,我想在第一个-实例之前删除所有字符。因此,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/ - .*//'删除了-的第一个实例之后的所有字符,但我之前找不到相同的字符。

8 个答案:

答案 0 :(得分:4)

喜欢这个。

sed 's/^[^-]* - //'

许多正则表达式引擎允许*?进行非贪婪搜索,但sed没有。

编辑:这不会改变威廉 - 肯特的例子,嵌入的连字符会阻止匹配。

(另外,Perl提供了一个非常方便的rename脚本来使用正则表达式批量重命名文件,但不是每个发行版都安装它。)

答案 1 :(得分:4)

$ awk '{print substr($0,index($0," - ")+3)}' file
Welcome Home.txt
One Upon - A Time.txt
Prince & The Frog.txt

即。只需从第一次出现的“ - ”打印到行尾。

答案 2 :(得分:3)

使用awk你可以这样做:

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

现场演示:http://ideone.com/2tBU4v

答案 3 :(得分:3)

最简单的方法是使用grep

$ grep -Po ' - \K.*' file
Welcome Home.txt
One Upon - A Time.txt
Prince & The Frog.txt

答案 4 :(得分:1)

我认为gawk对于这项工作可能更容易。

使用FPAT可以简化问题:

awk -v FPAT="- .*$" 'sub(/^- /,"",$1)' file

包含您的数据:

kent$  echo "Adam James - Welcome Home.txt
Mike & Harry - One Upon - A Time.txt
William-Kent - Prince & The Frog.txt"|awk -v FPAT="- .*$" 'sub(/^- /,"",$1)'
Welcome Home.txt
One Upon - A Time.txt
Prince & The Frog.txt

答案 5 :(得分:1)

在纯Bash中(没有产生额外的子进程):

list=('Adam James - Welcome Home.txt' 'Mike & Harry - One Upon - A Time.txt')
for str in "${list[@]}"; do echo ${str#*-}; done

打印:

Welcome Home.txt
One Upon - A Time.txt

答案 6 :(得分:1)

这可以在普通的POSIX sh中完成,没有bash功能:

$ 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

$ 

答案 7 :(得分:1)

这可能适合你(GNU sed):

 sed 's/ - /\n/;s/.*\n//' file