Sed有多个标准

时间:2012-07-19 21:47:11

标签: shell unix sed criteria conditional-statements

我有3个sed命令:

sed -n 's/.*domain=\([^&]*\).*sdk_ver=\([^&]*\).*/\1 \2/p' inputfile > outputfile
sed -n 's/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\2 \1/p'  inputfile > outputfile
sed -n 's/.*domain=\([^&]*\).*sdk_version=\([^&]*\).*/\1 \2/p' inputfile > outputfile

每个命令都有一个标准。我只想将3个命令放入1个命令中,以获得单个输出文件,其中包含所有结果作为三个标准的并集。

3 个答案:

答案 0 :(得分:9)

使用多个Sed表达式

您可以将多个sed表达式放在由换行符分隔的脚本中,也可以将多个表达式放在由 -e 选项分隔的多个表达式中。例如:

sed -n -e 's/.*domain=\([^&]*\).*sdk_ver=\([^&]*\).*/\1 \2/'      \
       -e 's/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\2 \1/'  \
       -e 's/.*domain=\([^&]*\).*sdk_version=\([^&]*\).*/\1 \2/p' \
       inputfile > outputfile

在此示例中,sed将在每个输入行上按顺序运行表达式,并仅在处理序列中的最终表达式后打印模式空间。肯定有其他方法可以做到这一点,但鉴于你的例子,这似乎是最合适的。

答案 1 :(得分:1)

sed -e允许使用;在一行中写入单独的命令。

sed -ne 's/.*domain=\([^&]*\).*sdk_ver=\([^&]*\).*/\1 \2/ ; s/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\2 \1/ ; s/.*domain=\([^&]*\).*sdk_version=\([^&]*\).*/\1 \2/p'

答案 2 :(得分:0)

这不会起作用吗?

sed -n 's/.*domain=\([^&]*\).*sdk_ver=\([^&]*\).*/\1 \2/p' inputfile | sed -n 's/.*sdk_version=\([^&]*\).*domain=\([^&]*\).*/\2 \1/p' | sed -n 's/.*domain=\([^&]*\).*sdk_version=\([^&]*\).*/\1 \2/p' > outputfile