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