如何从命令行中的多行sed命令转到脚本中的单行

时间:2010-08-12 22:06:19

标签: regex unix shell sed ksh

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

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会因为我认为是新行字符而抛出错误。任何人都可以帮我一把吗?仅供参考:正则表达式应该是多行替换。

谢谢!

4 个答案:

答案 0 :(得分: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

(未测试的)

答案 1 :(得分:0)

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

调用sed
cat test.txt | sed -f file.sed

答案 2 :(得分:0)

您可以尝试用`echo -e \\ r`

替换换行符

答案 3 :(得分:0)

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

如果你使用C Shell进行工作,你确定自己正在运行“ksh ./script”而不是“./script”吗?

否则,还有一些其他问题 - 或许在某处出现不平衡的报价。

查看“-v”和“-n”选项以及Korn Shell的“-x”选项。这可能会告诉您更多问题所在。