hi尝试将以下字符串替换为长字符串:
@x@
包含我从命令行获取的字符串:
read test
sed -i --backup 's/@x@/'${test}'/g' file.json README.md
,但仅适用于 1个单词,如果word之间有空格,则不起作用。甚至引号之间
sed: 1: "s/@x@/string test string: unterminated substitute in regular expression
答案 0 :(得分:2)
如果您是在MacOS上运行它并遇到“正则表达式中的未终止替代项” 的情况,则对此有一个更简单的解释:
MacOS的sed版本与Linux上的版本略有不同。 -i
需要一个参数。如果没有,只需在""
之后添加-i
sed -i "" --backup 's/@x@/'${test}'/g' file.json README.md
或者例如,如果您只需要删除圆顶线,则在Linux上可以使用,但是在MacOS上会显示“无效的命令代码”
sed -i 39d filenamehere.log
这在MacOS上有效
sed -i "" 39d filenamehere.log
答案 1 :(得分:0)
问题源自您使用单引号的方式。当前,您将在2.单引号后面终止输入。看到错误消息,它使您意识到它缺少某些东西。
如果文件包含以下内容:
foo @x@ foo
比您可以替换的内容例如使用以下命令:
sed 's/@x@/bar foo bar/' foo.txt > foo2.txt
并获得:
foo bar foo bar foo
如果您需要传递变量,戈登·戴维森(Gordon Davisson)的注释将为您显示正确的方式。
顺便说一句,如果要使用inplace选项,在我的Linux上,您需要使用以下命令:
sed -i.old "s/@x@/${test}/" foo.txt
但是我认为这可能取决于您的环境(mac?)。
答案 2 :(得分:0)
sed无法理解字符串,其中字符串是一系列文字字符。它用一组分隔符内的所有分隔符替换了启用了反向引用的“字符串”(也不是字符串)来替换正则表达式(不是字符串)(在正则表达式和替换中也需要仔细处理)。有关更多信息,请参见Is it possible to escape regex metacharacters reliably with sed。
要将字符串替换为另一个字符串,最简单的方法是仅使用能够理解诸如awk之类的字符串的工具:
$ cat file
before stuff
foo @x@ bar
after stuff
$ cat tst.awk
BEGIN {
old = ARGV[1]
new = ARGV[2]
ARGV[1] = ARGV[2] = ""
}
s = index($0,old) { $0 = substr($0,1,s-1) new substr($0,s+length(old)) }
{ print }
$ test='a/\t/&"b'
$ awk -f tst.awk '@x@' "$test" file
before stuff
foo a/\t/&"b bar
after stuff
无论test
包含什么字符,甚至包括换行符,上述内容都将起作用:
$ test='contains a
newline'
$ awk -f tst.awk '@x@' "$test" file
before stuff
foo contains a
newline bar
after stuff