我有一个linux接收器,想要重命名录音。录音看起来像
20131018 2245 - Channel 1 - Name of the movie.ts
我想只获得“movie.ts的名字”。我可以使用以下sed-命令轻松完成此操作:
echo 20131018 2245 - Channel 1 - Name of the movie.ts|sed 's!\(.*\) - \(.*\) - \(.*\)!\3!'
但是:如果电影的名称也包含分隔符“ - ”,那么它会在分隔符处将其剪掉:
echo 20131018 2245 - Channel 1 - Name of another movie - Second part.ts|sed 's!\(.*\) - \(.*\) - \(.*\)!\3!'
将输出:
另一部电影的名称
而不是
另一部电影的名字 - 第二部分。
我怎样才能做到这一点?
感谢名单
答案 0 :(得分:4)
.*
尽可能匹配(贪婪)。
将.
替换为[^-]
:
$ filename='20131018 2245 - Channel 1 - Name of another movie - Second part.ts'
$ echo $filename | sed 's!\([^-]*\) - \([^-]*\) - \([^-]*\)!\3!'
Name of another movie - Second part.ts
没有捕获组:
$ echo $filename | sed 's![^-]* - [^-]* - !!'
Name of another movie - Second part.ts
答案 1 :(得分:2)
对于拆分字符串,您可能更喜欢使用'cut'命令:
要替换的字符串:
filename='20131018 2245 - Channel 1 - Name of another movie - Second part.ts'
要申请的命令:
echo $filename | cut -d\- -f3-
前:
答案 2 :(得分:0)
使用awk
和来自falsetru示例的正则表达式
cat file
20131018 2245 - Channel 1 - Name of another movie - First part.ts
20131019 2245 - Channel 1 - Name of another movie - Second part.ts
20131022 1520 - Channel 3 - A good movie.ts
awk '{sub(/[^-]* - [^-]* - /,x)}1' file
Name of another movie - First part.ts
Name of another movie - Second part.ts
A good movie.ts
gnu awk version
(来自falsetru的复制正则表达式)
这使用后退参考
awk '{print gensub(/[^-]* - [^-]* - ([^-]*)/,"\\1","g")}' file