【问题标题】:How to go from a multiple line sed command in command line to single line in script如何从命令行中的多行 sed 命令转到脚本中的单行
【发布时间】:2010-08-12 22:06:19
【问题描述】:

如果我将其复制并粘贴到打开的 shell 中,我已经使用以下参数运行 sed:

cat test.txt | sed '/[,0-9]\{0,\}[0-9]\{1,\}[acd][0-9]\{1,\}[,0-9]\{0,\}/{N
s/[,0-9]\{0,\}[0-9]\{1,\}[acd][0-9]\{1,\}[,0-9]\{0,\}\n\-\-\-//}'

问题是,当我尝试将其移动到 KornShell (ksh) 脚本中时,ksh 会抛出错误,因为我认为是换行符。任何人都可以帮我解决这个问题吗?仅供参考:正则表达式应该是多行替换。

谢谢!

【问题讨论】:

  • 向我们展示错误消息,以及导致它们的确切脚本(如果它非常大,请将其缩减到相关行)。
  • 严重的虐待猫案件!

标签: regex unix shell sed ksh


【解决方案1】:

这个:\{0,\} 可以替换成这个:*

这个:\{1,\} 可以替换成这个:\+

没有必要转义连字符。

换行符可以替换为-e(或分号)

cat 可以通过使用文件名作为sed 的参数来替换

结果:

sed -e '/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*/{N' -e 's/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*\n---//}' test.txt

sed '/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*/{N;s/[,0-9]*[0-9]\+[acd][0-9]\+[,0-9]*\n---//}' test.txt

(未经测试)

【讨论】:

  • 谢谢 - 效果很好!那里的分号有什么意义?这是 sed 的一部分吗?
  • @Shane:分号是sed(以及其他几种语言)中使用的命令分隔符。 N 是一个命令,s/// 是另一个命令。您可以执行以下简单示例:echo 'ab' | sed 's/./X/; s/./a/2; s/X/b/' 将多个命令链接在一起(顺便说一下,它交换了“a”和“b” - 但这可能更好:sed 's/\(.\)\(.\)/\2\1/')。
  • (.)(.) 我也更喜欢那个!
  • 应该是sed -r 's/(.)(.)/\2\1/'sed 's/\\(.\\)\\(.\\)/\2\1/'
【解决方案2】:

您可以尝试将您的正则表达式放在一个文件中并使用选项 -f 调用 sed 吗?

cat test.txt | sed -f file.sed

【讨论】:

  • 不,那没用。我得到同样的错误。不过感谢您的建议!
【解决方案3】:

你能不能尝试用`echo -e \\r`替换换行符

【讨论】:

    【解决方案4】:

    Korn Shell - 与 C Shell 不同 - 字符串中的换行没有问题。因此,换行符不太可能成为您的问题。相同的 cmets 适用于 Bourne 和 POSIX shell 以及 Bash。我已经复制了您的示例并在 Bash 和 Korn shell 下的 Linux 上运行它,没有任何问题。

    如果您使用 C Shell 进行工作,您确定您运行的是“ksh ./script”而不是“./script”吗?

    否则,还有其他问题 - 可能是某处引用不平衡。

    查看 Korn Shell 的“-v”和“-n”选项以及“-x”选项。这可能会告诉你更多关于问题出在哪里。

    【讨论】:

      猜你喜欢
      • 2016-08-26
      • 2019-06-11
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2011-03-10
      • 1970-01-01
      • 2018-03-25
      • 2022-09-23
      相关资源
      最近更新 更多