我想提取介于多行文件中两个|
符号之间的文本。例如,我想从P16
中提取sp|P16|SM2
。我找到了一个可能的答案here。但是,我不能将答案适用于我的案子。我使用以下内容:
sed -n '/|/,/|/ p' filename
或通过转发|
符号
sed -n '/\|/,/\|/ p' filename
但是我收到的结果是文件中的所有行都没有改变,即使我使用-n
来禁止自动打印模式空间。我缺少什么想法?
[编辑] :
我可以使用以下方法获得所需的结果。但是,我想解释为什么上面提到的不起作用:
sed 's/^sp|//' filename | sed 's/|.*//'
答案 0 :(得分:2)
此任务的工具为cut
$ echo "sp|P16|SM2" | cut -d'|' -f2
P16
答案 1 :(得分:1)
awk是基于列的数据的更好选择:
awk -F'|' '{print $2}'
会给你P16
以下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/
地址是错误的用法,它检查行,而不是一行。