【问题标题】:Add a string to the beginning of a line containing a pattern [duplicate]将字符串添加到包含模式的行的开头[重复]
【发布时间】:2015-04-21 22:55:11
【问题描述】:

我正在尝试注释脚本中存在给定模式列表中的模式的行。现在,我可以在命令行上通过以下方式进行操作:

sed '/abcdefg/ s/^/#/' file.sql > file.commented

但是,如果我将变量用于模式(而不是像上面那样直接使用 abcdefg),我将无法做到这一点。

pattern=abcdefg
sed '/$pattern/ s/^/#/' file.sql > file.commented

看起来它正在转义美元字符而不是获取变量的值。

你如何用 awk 做同样的事情?

【问题讨论】:

  • 您是否浪费了十秒钟在 StackOverflow 中寻找答案?这个问题已经被问过并解决了数百次。
  • 好吧,对不起。但是我昨天也搜索了它,并尝试了不同的东西,然后在这里度过/浪费了我的时间。我将删除问题。
  • @AjimBagwan:不要删除问题,因为下面已经发布了非正则表达式选项的答案,这可能会帮助其他读者。
  • @AjimBagwan:在我看来,一旦你问了它,就没有必要删除它,因为有些用户会花时间帮助你。

标签: regex bash awk sed vi


【解决方案1】:

您需要使用双引号使其与 shell 中的变量一起使用:

sed "/$pattern/ s/^/#/" file.sql > file.commented

您还可以使用 shell 的内联功能来保存输入文件本身的更改

sed -i.bak "/$pattern/ s/^/#/" file.sql

但最好避免 sed 用于此作业,因为它使用正则表达式,如果 $pattern 包含 / 或某些特殊的正则表达式元字符,上述命令将中断。最好像这样使用awk

awk -v p="$pattern" 'index($0, p) {$0 = "#" $0} 1' file.sql > file.commented

【讨论】:

  • 该死!我试过了,但忽略了它,认为它不起作用。但它有效。谢谢。
  • 你如何用 awk 做同样的事情?
  • 我已经在答案中提供了等效的 awk 命令。
  • awk 版本只打印匹配的行(前面有一个#)。它不会像 sed 那样将不匹配的行重定向到文件。 index($0,p) 究竟是做什么的?
猜你喜欢
  • 1970-01-01
  • 2019-09-19
  • 2023-03-05
  • 2016-10-23
  • 2011-07-26
  • 2011-08-30
  • 1970-01-01
  • 2019-10-06
  • 1970-01-01
相关资源
最近更新 更多