Sed:删除双破折号之前的所有字符,包括双破折号

Sed:删除双破折号之前的所有字符,包括双破折号,sed,Sed,我有一个带有双破折号的文件名列表: New York--1984 and counting.txt Timeless Wonders--Silver-Guardians.txt Project Blue Gale--Hills of Green.txt 我需要删除双破折号和双破折号前的所有字符: 1984 and counting.txt Silver-Guardians.txt Hills of Green.txt 以下是使用SED的模式代码: for f in *; do mv "$f"

我有一个带有双破折号的文件名列表:

New York--1984 and counting.txt
Timeless Wonders--Silver-Guardians.txt
Project Blue Gale--Hills of Green.txt
我需要删除双破折号和双破折号前的所有字符:

1984 and counting.txt
Silver-Guardians.txt
Hills of Green.txt
以下是使用SED的模式代码:

for f in *; do mv "$f" "$(sed 's/[^\--]*--//')"; done
RE错误:无效的字符范围


如果我改变它,使它只搜索一个破折号,它的工作。那我怎么才能找到双破折号呢?提前谢谢

错误是由于您的
[^\-]
模式定义了一个介于
\
(1992年12月)和
-
(45年12月)之间的范围,这是不正确的

我建议使用

for f in *; do mv "$f" "$(sed 's/^[^-]*--//' <<< "$f")"; done
输出:

1984 and counting.txt
1984 and counting.txt

错误是由于您的
[^\-]
模式定义了介于
\
(1992年12月)和
-
(45年12月)之间的范围,这是不正确的

我建议使用

for f in *; do mv "$f" "$(sed 's/^[^-]*--//' <<< "$f")"; done
输出:

1984 and counting.txt
1984 and counting.txt
您可以使用(Perl版本,而不是util linux版本):

删除
-n
实际上执行重命名
*?--
是一个正则表达式,可以不贪婪地匹配所有内容,直到第一次出现
--

您可以使用(Perl表达式,而不是util linux表达式):

删除
-n
实际上执行重命名
*?-->
是一个正则表达式,可以对第一次出现的
-->

之前的所有内容进行非贪婪匹配,这可能对您有用(GNU并行):

在包含源文件的目录中运行该命令并检查输出。如果全部签出,请删除
--dryrun
选项,然后再次运行

使用GNU sed的替代解决方案:

ls *.txt | sed -E 'h;s/--/\n/;H;g;s/(.*)\n.*\n(.*)/mv -v "\1" "\2"/e'
注意:如果您想在实际运行前检查,请删除
e
替换标志。

这可能适合您(GNU并行):

在包含源文件的目录中运行该命令并检查输出。如果全部签出,请删除
--dryrun
选项,然后再次运行

使用GNU sed的替代解决方案:

ls *.txt | sed -E 'h;s/--/\n/;H;g;s/(.*)\n.*\n(.*)/mv -v "\1" "\2"/e'

注意:如果你想在真正运行之前检查,请删除
e
substitution标志。

也许
“$(sed's/^[^-]*-/'@WiktorStribiżew是的,行得通,我使用的完整命令是
for f in*;do mv“$f”“$(sed's/^[^-]*-/'也许
”$(sed's/^-]*--//“@WiktorStribiżew是的,这是有效的,我使用的完整命令是
for f in*;do mv“$f”“$(sed's/^[^-]*--/')当然,shell提供了更有效的参数扩展:
mv“$f”“${f#*--}
(如果你想阻止双破折号,你需要在双破折号之前添加一个单独的防护装置)。@tripleee是的,昨天在我的脚本中使用了这个,但我在这里重点介绍了正则表达式方法
[^-]*
将无法捕捉到
纽约--
-仅假设要删除的文本中可以出现一个破折号/负号。
*?
也将涵盖这种情况。@virolino
sed
不支持惰性量词。参数扩展更可能在这里工作。@virolino大多数
sed
方言不支持n关于贪婪匹配。但OP似乎特别希望避免使用破折号。当然,shell提供的参数扩展应该更有效:
mv“$f”“${f#*-}”
(不过如果要防止破折号,需要在双破折号之前添加单独的保护以防止破折号)@tripleee是的,昨天在我的脚本中使用了这个方法,但我在这里主要关注正则表达式方法
[^-]*
将无法捕捉到
纽约--
-仅假设要删除的文本中可以出现一个破折号/负号。
*?
也将涵盖这种情况。@virolino
sed
不支持惰性量词。参数扩展更可能在这里工作。@virolino大多数
sed
方言不支持n关于贪婪匹配。但OP似乎特别想要避免任何带有破折号的东西。