【问题标题】:Replacing multiple lines with sed用 sed 替换多行
【发布时间】:2013-07-18 17:39:20
【问题描述】:

我有一种情况,我想使用 sed 替换文件中的多行文本。 搜索文本为:

Enable=Yes
UseTest=No
UseTempS=No
UseStatic=No
IPAddress=
SubnetMask=
DefaultGateway=

而要替换的文字是

Enable=No
UseTest=No
UseTempS=No
UseStatic=No
IPAddress=0.0.0.0
SubnetMask=255.255.255.0
DefaultGateway=1.1.1.1

任何帮助将不胜感激。

【问题讨论】:

  • 基本的 sed 替换命令是 sed 's/input/output/g' file。尝试一下,我们可以帮助您解决可能遇到的问题。
  • 另一个选项(如果它符合您的要求)是,您从文件中删除整个块,并读取替换的文件内容。与r。即不是行替换,而是块替换。无论如何,弄脏你的手是第一步。
  • 但是文本中如何有新行.. 如何在输入和输出中放置新行符号,将其作为输入不起作用 Enable=Yes\nUseStatic=No\nUseTempS=否\nUseStaticWINS=否\nIPAddress=\nSubnetMask=\nDefaultGateway=
  • 不要尝试逐行替换整块替换。

标签: sed


【解决方案1】:

GNU 代码:

sed -r 's#(.*)=(.*)#/\1=/s/=.*/=\2/#' file2|sed -f - file1

会话协议:

$猫文件1 启用=是 使用测试=否 UseTempS=否 使用静态=否 IP地址= 子网掩码= 默认网关= $猫文件2 启用=否 使用测试=否 UseTempS=否 使用静态=否 IP地址=0.0.0.0 子网掩码=255.255.255.0 默认网关=1.1.1.1 $ sed -r 's#(.*)=(.*)#/\1=/s/=.*/=\2/#' file2|sed -f - file1 启用=否 使用测试=否 UseTempS=否 使用静态=否 IP地址=0.0.0.0 子网掩码=255.255.255.0 默认网关=1.1.1.1

【讨论】:

  • 哇...您确实很有风格,先生。
【解决方案2】:

如果您想在阅读时按顺序匹配这些字段,一种可移植的方式:

sed -e   '/Enable=Yes/!b;N;
   /UseTest=No/!b;N;     
   /UseTempS=No/!b;N;    
   /UseStatic=No$/!b;N;  
   /IPAddress=$/!b;N;    
   /SubnetMask=$/!b;N;   
   /DefaultGateway=$/!b; 
   s/.*//;rtemplate' input

模板

Enable=No
UseTest=No
UseTempS=No
UseStatic=No
IPAddress=0.0.0.0
SubnetMask=255.255.255.0
DefaultGateway=1.1.1.1

【讨论】:

  • 这里的模板是什么?
  • 这是一个包含替换文本的文件
【解决方案3】:
cat yourfile.txt | sed -f zarmacimamadzaghli.sed

zarmacimamadzaghli.sed

s/Enable=Yes/Enable=No/
s/UseTest=No/UseTest=No/
s/UseTempS=No/UseTempS=No/
s/UseStatic=No/UseStatic=No/
s/IPAddress=/IPAddress=0.0.0.0/
s/SubnetMask=/SubnetMask=255.255.255.0/
s/DefaultGateway=/DefaultGateway=1.1.1.1/

【讨论】:

  • 对不起我的最后评论。在许多文件中更改相同的文本很有用。分组可以缩短时间,但没关系。
  • @Birei 好吧,那么对多个文件执行此操作有什么问题?
  • 完全没问题。我的第一个想法是 OP 只想做一次,所以忘记删除的评论。
猜你喜欢
  • 2010-11-16
  • 1970-01-01
  • 2022-01-19
  • 2020-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-20
相关资源
最近更新 更多