【问题标题】:KSH replacing string after string match [duplicate]字符串匹配后KSH替换字符串[重复]
【发布时间】:2015-08-11 01:05:23
【问题描述】:

我第一次在 Stack 上:

我正在按如下方式进行模式匹配。在这种情况下,$VAR1 是“/usr/lib/sendmail”。使用 while 循环从单独的文件中读取变量。

cat /etc/rc.tcpip |grep -w "^start[[:blank:]]${VAR1}"

我想在比赛开始时“评论该行”(#)。我确定它是 sed 但我似乎无法弄清楚如何使它工作。

所以现有的线路:

start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"

想要的结果:

# start /usr/lib/sendmail "$src_running" "-bd -q${qpi}"

【问题讨论】:

  • 你有一个 UUOC:smallo.ruhr.de/award.htmlcat $FILE | grep $PATTERN 是不必要的。你可以简单地做grep $PATTERN $FILEgrep $PATTERN < $FILE
  • BashFAQ #21,mywiki.wooledge.org/BashFAQ/021,非常值得一读。 (是的,它确实明确适用于 ksh)。
  • 匹配开始之后的那一行,还是匹配开始with的那一行?您的示例显然显示了后者。

标签: regex awk sed ksh


【解决方案1】:

试试

sed '\|^start[[:blank:]]'"$VAR1"'|s/^/# /' /etc/rc.tcpip

您需要\|,因为您的 var 中包含 /。如果您 sed 接受 -i,您可以将结果放在同一个文件中。

sed 命令通常采用以下形式:

/pattern1/s/pattern2/replacement/

pattern1 选择一行来应用替换 (s),pattern2 是什么 匹配,替换是替换匹配的内容。在您的情况下,pattern1 包含斜杠字符 /,因此要在 pattern1 中使用它,需要使用 \ 进行转义。但是斜线在 $VAR1 内,因此我们需要编辑 $VAR1 以将每个 / 替换为 \/

相反,使用替代分隔符代替 / 更简单,仅用于 /pattern1/。这个语法有点奇怪和不对称:

\|pattern1|s/pattern2/replacement/

行首的\ 表示下一个字符是替代分隔符。我选择了|,但另一个不在 pattern1 中的字符也可以,例如

\;pattern1;s/pattern2/replacement/

【讨论】:

  • 谢谢...这确实有效。但是,将代码放入我不完全理解的脚本中最终会“咬”我。那么,为什么“\”转义出现在“|”之前的开头?而不是直接在变量前面。我了解它的需要,但不了解安置。对不起,额外的问题,但我真的需要了解它是如何运作的。谢谢!!
  • @PeteNMeyburg 我添加了解释
猜你喜欢
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 2021-06-02
  • 1970-01-01
  • 2013-08-09
相关资源
最近更新 更多