我有一个有几行的文件,想从中输出一个单词。例如
bla bla bla bla
WORD1 bla ldskjf sldfkj 0xksjdflksjflksjf
在这个文件中,我只想输出单词0xksjdflksjflksjf
。我正在考虑一个命令,它将查找以WORD1
开头的行,然后在该行中查找以0x
开头的单词。
我很确定awk
或sed
会允许我这样做。我找到了一种方法,但它不是很"干净";
awk '/^WORD1/ {print $5}'
它可以工作,但是有没有更好的方法(例如基于单词模式而不是它在行的位置)来做到这一点?
如果您有一个名为0x.txt的文件,其中包含以下内容:
bla bla bla bla
WORD1 bla ldskjf sldfkj 0xksjdflksjflksjf
bla bla bla bla
WORD1 bla 0xksjdflksjflks ldskjf sldfkj
:
awk '/^WORD1/ {for (i=1;i<=NF;i++) if ( match($i, /^0x/) ) print $i}' 0x.txt
将打印不依赖于列号的所需内容:
0xksjdflksjflksjf
0xksjdflksjflks
sed
版本(使用GNU sed):
输入文件
cat file
bla bla bla bla
WORD1 bla ldskjf sldfkj 0xksjdflksjflksjf
命令执行:
sed -nr /^WORD1/{'s/^(WORD1.+)(0xw+)(.*$)/2/p}' file
0xksjdflksjflksjf
抑制正常输出(-n
),找到以WORD1
开头的行,用空替换0x
之前的所有内容,然后打印该行。
我喜欢@AlexZhu的答案,但作为一种替代方案,无需使用match()
从1
迭代到NF
,然后使用match()
和substr()
设置的RSTART
和RLENGTH
内置变量,例如,使用@AlexZhu提供的相同输入文件,您将拥有:
awk '
/^WORD1/ {
match($0,/[ ]0x[^ ]+/)
if (RLENGTH > -1)
print substr ($0, RSTART+1, RLENGTH)
}
' file
0xksjdflksjflksjf
0xksjdflksjflks
每个函数的文档都包含在GNU Awk用户指南中。