如何在Unix系统中替换文件中的字符串

3

经过一番搜索,我发现sed命令就是我需要的。但说实话,这个命令的标志似乎很难理解。我只想用另一个单引号字符串替换文件中的一个单引号字符串。word1、word2等都不是单引号或双引号。例如:

之前:foo.txt

word1 word2 word3 'This the text that needs replacement' word4 word5

之后:foo.txt

word1 word2 word3 'I have been replaced' word4 word5

请注意,“这是需要替换的文本”文本不是固定的,其内容可能会有所变化。

_sed_命令非常简单,没有必要在其周围编写脚本。如果要替换的文本不是固定的,只需在第一个斜杠和第二个斜杠之间输入其他内容 sed -e "s/'something else'/'the new text'/g" foo.txt > bar.txt ... 除非这是某个常见操作的一步,但您需要提供更多信息。 - Stephen P
@StephenP 谢谢你的回复。现在语法看起来很简单,但是我不知道文本的内容,所以无法使用那个“其他东西”。事实上,唯一的常量就是这些词(wordN)。 - Billy Grande
嗯,你怎么知道哪些文本将被替换,以及替换的文本是什么?你必须在某个时候知道这一点才能运行命令。而且,wordM wordN wordO wordP 中是否会包含撇号?这很重要,因为单引号和撇号是相同的。在编程时,你必须对问题空间非常清楚明确。 - Stephen P
我知道要插入的新文本,但不知道要替换的那一个。这些单词中没有撇号或任何引号。 - Billy Grande
2个回答

5

只需将其替换为以下语法:

cat foo.txt  | sed -e 's/want to be/have been/g'

替换文件(例如在Mac上)

sed -i '' 's/want to be/have been/g' foo.txt

或其他Unix操作系统

sed -i.bak 's/want to be/have been/g' foo.txt 

1
UUOC — sed 写入标准输出,因此你的第一个例子 cat foo.txt | ... 等同于 sed -e 's/want to be/have been/g' foo.txt foo.txt 没有被修改,而是被 sed 读取、转换,并将结果写入标准输出。典型用法是 sed -e 's/this/that/g' inputfile.txt > outputfile.txt 我自己大多数时候也使用了你的 -i.bak 风格。 - Stephen P

4
这将用另一个东西替换单引号中的字符串。你的问题不够具体。
sed "s/'[^']*'/'something'/" file

因为搜索表达式中使用了单引号,所以我们将整个sed脚本放在双引号中。这意味着,在脚本表达式中,任何将受到Shell替换的内容(特别是反斜杠和美元符号,当然还有文本中的双引号)都需要转义。
正则表达式'[^']*'表示单引号,后跟一个不是单引号的字符,重复零次或多次,后跟另一个单引号。换句话说,就是在单引号内的除了单引号之外的任何内容。
此外,这将打印到标准输出。使用sed -i来原地修改文件,或将输出重定向到您想要的位置。

听起来你应该写一个新的问题,这次要包含所有细节。为了提供背景信息,请在问题中附上链接。虽然这是一个非常常见的话题,但你应该解释一下你的问题与那些大量相似但又不完全相同的问题有何不同之处。 - tripleee
1
举个例子,https://dev59.com/0Wsz5IYBdhLWcg3wwKqh - tripleee
太棒了!再次感谢! - Billy Grande
同时,https://dev59.com/JmDVa4cB1Zd3GeqPeY2I - tripleee
@tripleee 如上所述,使用"引用sed语句意味着它将被插值,因此可能会产生意想不到的后果。如果我们坚持使用'来引用该语句,代码如下:sed 's/'\''[^'\'']*'\''/'\''replacement'\''/' file。然而,我们可以使用反向引用来使代码更易读(也许只有我觉得),代码如下:sed 's/\('\''\)[^\1]*\1/\1replacement\1/' file。这种方法可能只适用于GNU sed。 - potong
显示剩余4条评论

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