RegEx 使用 sed 进行查找和替换、匹配组并按条件替换

RegEx 使用 sed 进行查找和替换、匹配组并按条件替换

使用 sed 可以实现这个吗?

我实际上是在 iTunes 中使用“使用 sed 编辑曲目名称”Doug 的脚本,我有一组曲目,它们的标题有两种:

Identical string - Identical string

或者

Some string - some different string

在第一种情况下,我想删除其中一个相同的字符串和中间的字符串-,这样就只剩下“相同字符串”的一次迭代。如果字符串不同(第二种情况),我想保留它。

我试过了s/^(.*) - $1/$1/,但似乎无法匹配我刚刚定义的组。s/^(.*) - (.*)/$1/显然,对于第一种情况有效,但对于第二种情况会错误处理。有没有使用我提到的工具的其他方法来解决这个问题?

答案1

引用您刚刚定义的组,但为此sed使用\n,而不是$n。此外,使用 进行分组( )仅在“扩展”模式下有效(使用选项启用-r):

sed -r 's/^(.+) - \1/\1/'

在“基本”模式下,您可以使用:

sed 's/^\(.*\) - \1/\1/'

答案2

这是可行的,gnuwin32 sed。GNU sed 4.2.1

C:\tes>echo ident - ident | sed -r "s/^(.*) - \1 /z/"
z

C:\tes>echo ident - idrnt | sed -r "s/^(.*) - \1 /z/"
ident - idrnt

C:\tes>echo ident - ident | sed -r "s/^(.*) - \1 /\1/"
ident

C:\tes>echo ident - idevt | sed -r "s/^(.*) - \1 /\1/"
ident - idevt

C:\tes>

相关内容