sed用正则表达式替换一行

时间:2016-08-08 20:13:53

标签: sed

我想用sed替换下面条目中的ip地址。

1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT "198.18.193.23,2509.417\;198.18.193.25,2609.417\;198.18.193.27,2709.417"

1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT“19.18.19.27,1110.400 \; 198.18.193.25,2609.417 \; 198.18.193.27,2709.417”

我尝试了以下内容:

sed -i s /“198.18.193.23,2409.417 \; 198.18.193.25,2609.417 \; 198.18.193.27,2709.417”/“198.18.19.27,1110.400”/ filename.txt

如果实际条目中只有一个IP地址,则上述条目有效。如果有多个由正则表达式分隔的ip地址,则不起作用。

2 个答案:

答案 0 :(得分:0)

三倍的反斜杠它会起作用:顺便说一下,引号放错地方,或者你也必须逃避它们。

你必须逃脱:

  • 来自shell和sed的反斜杠,因此需要3个反斜杠。
  • 点,但它仍然像这样工作,因为它匹配任何字符,所以点匹配。

所以quickfix是

sed -i s/"198.18.193.23,2509.417\\\;198.18.193.25,2609.417\\\;198.18.193.27,2709.417"/"198.18.19.27,1110.400"/ file.txt

2个问题:

    sed完全忽略
  • 引号,因为shell使用它们
  • 点被视为通配符

因此,这个字符串将被替换,这可能不是你想要的(我用数字和字母替换了点):

1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT 1987187193723,2509.417\;198718z193v25,2609k417\;198.18.193.27,2709.417

更清洁的修复

sed -i "s/\"198\.18\.193\.23,2509\.417\\\;198\.18\.193\.25,2609\.417\\\;198\.18\.193\.27,2709\.417\"/\"198.18.19.27,1110.400\"/" file.txt

如果你想随机化输出,用1到100之间的随机数替换1110,那么这样做(不需要shuf):

sed -i "s/\"198\.18\.193\.23,2509\.417\\\;198\.18\.193\.25,2609\.417\\\;198\.18\.193\.27,2709\.417\"/\"198.18.19.27,$(($RANDOM%100+1)).400\"/" file.txt

答案 1 :(得分:0)

您的问题非常不明确,但如果您只想更换引号之间的任何IP地址列表,那么这只是:

$ sed 's/"[^"]*"/"198.18.19.27,1110.400"/' file
1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT "198.18.19.27,1110.400"

如果这不是您想要的,那么请编辑您的问题以澄清您的要求。特别解释你的问题中的这2个句子是什么意思:

  1. 如果实际条目中只有一个IP地址,则上述条目有效。
  2. 如果有多个正则表达式分隔的IP地址,则无法正常工作。
  3. 以上内容在此输入文件上运行:

    $ cat file
    1500.arp1.akaarp.net.00000000.7ac112c6.123456.6 30 IN TXT "198.18.193.23,2509.417\;198.18.193.25,2609.417\;198.18.193.27,2709.417"