【问题标题】:find and replace in a text file using sed使用 sed 在文本文件中查找和替换
【发布时间】:2012-02-14 02:57:02
【问题描述】:

我是 sed 的新手。

我有一个文本文件,我想替换这个字符串的出现:

allow ^127\.0\.0\.1$

用这个字符串:

allow ^107\.21\.206\.35$

我使用的代码如下:

sed 's/allow ^127\.0\.0\.1$/allow ^107\.21\.206\.35$/g' test.txt

但是,id 不起作用。我做错了什么?

谢谢

【问题讨论】:

  • 您要对文件本身进行更改吗?如果是这样,您将需要 -i 选项。

标签: replace sed find


【解决方案1】:

你必须转义'^'和'$':

$ sed 's/allow \^127\.0\.0\.1\$/allow \^107\.21\.206\.35\$/g' test.txt

未转义,'^' 匹配行首,'$' 匹配行尾。为了完全匹配字符,它们必须用“\”转义。 sed 的大多数实现都使用基本的正则表达式,其中必须对以下字符进行转义以匹配字面: ^.[$()|*+?{\

【讨论】:

  • @Monty:我没有注意到您的输入文本中有文字“\”。
【解决方案2】:

这可能对你有用:

echo 'allow ^127\.0\.0\.1$' | 
sed 's/allow ^127\\.0\\.0\\.1\$/allow ^107\\.21\\.206\\.35$/'
allow ^107\.21\.206\.35$

^$ 只需要在替换命令的匹配部分分别在字符串的前面和后面进行转义。 \ 在匹配和替换中都需要转义。

【讨论】:

    【解决方案3】:

    您不仅应该转义 \(使用另一个反斜杠),还应该转义 .(正则表达式将 . 视为“匹配任何单个字符”)。 ^$ 字符也在正则表达式中保留。

    $ echo "allow ^127\.0\.0\.1$" > /tmp/test
    $ cat /tmp/test
    allow ^127\.0\.0\.1$
    $ sed 's/allow \^127\\\.0\\\.0\\\.1\$/allow ^107\\.21\\.206\\.35$/g' -i /tmp/test
    $ cat /tmp/test
    allow ^107.21.206.35$
    

    在替换字符串中,\ 应该转义,否则单个 \ 将转义它旁边的 .

    【讨论】:

    • @potong 好点,在上面的例子中,没有必要在 sed 的正则表达式中转义第一个 ^。但是^ 也是集合中的否定运算符,也应该在该上下文中进行转义。
    猜你喜欢
    • 2019-07-02
    • 2010-12-20
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 2017-09-12
    • 2023-02-09
    • 2011-06-12
    相关资源
    最近更新 更多