如何使用sed在两个条形符号之间提取文本(即“|”)?

时间:2016-04-04 12:50:16

标签: unix sed

我想提取介于多行文件中两个|符号之间的文本。例如,我想从P16中提取sp|P16|SM2。我找到了一个可能的答案here。但是,我不能将答案适用于我的案子。我使用以下内容:

sed -n '/|/,/|/ p' filename

或通过转发|符号

sed -n '/\|/,/\|/ p' filename

但是我收到的结果是文件中的所有行都没有改变,即使我使用-n来禁止自动打印模式空间。我缺少什么想法?

[编辑]

我可以使用以下方法获得所需的结果。但是,我想解释为什么上面提到的不起作用:

sed 's/^sp|//' filename | sed 's/|.*//'

2 个答案:

答案 0 :(得分:2)

此任务的工具为cut

$ echo "sp|P16|SM2" | cut -d'|' -f2
P16

答案 1 :(得分:1)

awk是基于列的数据的更好选择:

awk -F'|' '{print $2}' 

会给你P16

sed one-liner:

以下sed one-liner只会为您留下第二栏:

kent$  echo "sp|P16|SM2"|sed 's/[^|]*|//;s/|[^|]*//' 
P16

或使用分组:

kent$  echo "sp|P16|SM2"|sed 's/.*|\([^|]*\)|.*/\1/'     
P16

简短解释为什么你的两个命令不起作用:

1) sed -n '/|/,/|/ p' filename

此sed将在两行之间打印行,其中包含|

2) sed -n '/\|/,/\|/ p' filename

Sed将BRE视为默认值。如果你逃脱|,你给了他们特殊的意义,逻辑或。再次,/pat1/,/pat2/地址是错误的用法,它检查行,而不是一行。