Sed错误:替换命令中的标志有误:“U”。

12

我在bash脚本方面还很新,正在尝试使用sed在文件中替换一些词汇。以下是我在脚本中使用的bash代码:

sed -i '' "s/<pre>.*<\/pre>/<pre>($NEWNAME) $MD5<\/pre>/"~/Desktop/replace.html

而且我收到了错误消息,显示:bad flag in substitute command: 'U'。我使用双引号是因为我需要放变量进去。

我的环境是Mac。

======================================

1.结果发现我忘记在替换字符串和文件名之间留空格了,导致结果始终显示:bad flag in substitute command: '~'。现在它可以正常工作了。

2.原因是我使用MD5=$(md5 path)创建MD5值,它得到的结果是MD5 (path) *****,而路径包含/,打破了正则表达式。将MD5=$(md5 -q path)更改后,就可以解决这个问题。


1
不要使用文本处理工具来编辑 HTML。请使用专为处理 HTML 而设计的工具。 - Tom Fenech
@TomFenech 谢谢。但是我必须使用shell脚本上传文件并更改HTML中的md5值。你有更好的想法吗? - JasmineOT
使用支持编辑HTML的语言,例如Perl、Python、PHP、Ruby等。 - Tom Fenech
@TomFenech 我的HTML非常简单,我只需要更改其中的一个MD5值。现在为了支持这个,学习一门新语言对我来说是一种负担。但我以后会尝试。非常感谢你。 - JasmineOT
1个回答

28

很可能你的$NEWNAME变量中包含正斜杠,在sed中被用作正则表达式的定界符。尝试使用备用定界符,例如~

sed -i '' "s~<pre>.*</pre>~<pre>($NEWNAME) $MD5</pre>~" ~/Desktop/replace.html

感谢您的快速回答。我回显这些变量并发现 MD5 得到了正斜杠。但是,使用替代分隔符(如 ~)会出现类似的错误:substitute command: '~' 中有错误标志。 - JasmineOT
你也可以使用控制字符作为sed分隔符,例如 sed -i'' "s^A<pre>.*</pre>^A<pre>($NEWNAME) $MD5</pre>^A",其中 ^A 是通过同时按下 control-V-A 键输入的。 - anubhava
好的,说实话,这是我第一次接触到备用分隔符的概念。非常感谢。我会继续尝试。 - JasmineOT
1
不需要再试了。原因很简单,你使用的变量不能有未转义的正则表达式分隔符。因此需要使用替代分隔符,比如我在之前的评论中发布的控制字符。否则,可以使用其他工具,比如awk。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接