【问题标题】:grep and replace multi line values in bashgrep并替换bash中的多行值
【发布时间】:2020-11-23 10:37:08
【问题描述】:

如何从我的配置文件中有效地取消注释以下行。

#PPD=/home/mine/ppd (Line no. 100)
#_dco_ppd.c \
#       -DUSE_LIC -I$(LIC)/include -I$(LIC)/include/grok.c \
#       -L$(LIC)/lib -llic -lokta

我尝试了以下选项均无效

grep -A 4 "PPD=/home/mine/ppd" config | xargs 0 sed -i 's/^#//g' [抛出以下错误]

sed: 无效选项 -- 'D' 用法:sed [OPTION]... {script-only-if-no-other-script} [input-file]...

其他尝试

sed -i 's|#PPD=/home/mine/ppd|PPD=/home/mine/ppd|' config (worked)
sed -i 's|#_dco_ppd.c|_dco_ppd.c|' config (worked)
sed -i 's|#       -DUSE_LIC|       -DUSE_LIC|' config (didnt work)
sed -i 's|#-DUSE_LIC|-DUSE_LIC|' config (didnt work as well)

我哪里错了?

我在 14.04.1-Ubuntu Docker 容器上

GNU bash,版本 4.3.11(1)-release (x86_64-pc-linux-gnu)

【问题讨论】:

  • 当我尝试你的尝试时,0xargs 之后会抛出No such file or directory 错误(但你有一些其他错误).. 在任何情况下,你不能将 grep 结果传递给 sed当你也需要就地使用时的一种方式

标签: sed grep


【解决方案1】:
sed -Ei '/^#PPD/,/^#.*-lokta$/{s/#//}' configfile

在您的 sed 语句中查找所需的文本

/^#PPD/ - 以 (^) #PPD 开头的行到(用 , 表示)...

/^#.*-lokta$/ - 以 (^) # 开头的行,然后是任何内容,然后是 -lokta,行尾 ($)

然后执行包含在 {}

中的替换

【讨论】:

  • 好一个。建议:这里不需要-E{} 分组,s/^#// 会更健壮
  • 公平点,但我认为花括号有助于提高可读性。
  • 同意。另一个建议是sed '/^#PPD/,+3 s/^#//',因为行数似乎是固定的。根据-i 的使用情况和Ubuntu Docker,OP 可能有GNU sed
  • @SUndeep :感谢您的帮助和时间 :) 感谢您的建议
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-14
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多