如何将字符串拆分为3个部分,即使分隔符存在两次以上也是如此

时间:2013-10-25 08:09:35

标签: regex string shell sed split

我有一个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!'

将输出:

另一部电影的名称

而不是

另一部电影的名字 - 第二部分。

我怎样才能做到这一点?

感谢名单

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-
  • -d:定义分隔符
  • -f:定义要提取的列

前:

  • -f3:返回第3列
  • -f3-5:返回第3至5列
  • -f1,3-:将第1列和第3列返回到行尾(

答案 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