我有一个txt
文件。我想过滤该文件中的某个单词。
例子:
$PILOT_FIRSTNAME $PILOT_LASTNAME. This is the final confirmation for this flight.
我想要如下输出:
PILOT_FIRSTNAME
PILOT_LASTNAME
所有带有 的单词都有哪些$
,该单词仅用于提取?
答案1
使用 grep 的 PCRE(perl 兼容正则表达式)模式:
$ grep -Po '\$\K\w*' yourfile
PILOT_FIRSTNAME
PILOT_LASTNAME
\$
:匹配文字$
\K
: (忽略它)\w
: 后跟零个或多个单词字符
如果你想匹配并保留文字$
字符,那么你就不需要修饰符\K
了——事实上你根本不需要 PCRE,你可以简单地使用
$ grep -o '\$\w*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME
或者(可能更便携)
grep -o '\$[_[:alnum:]]*' yourfile
$PILOT_FIRSTNAME
$PILOT_LASTNAME
答案2
因此,如果您想以换行符分隔的文件字段(如果以 开头)$
,您可以执行以下操作:
awk '{for(i=1;i<=NF;i++){if($i~/^\$/){printf "%s\n",substr($i,2)}}}' file.txt
展开形式:
awk '{
for (i=1;i<=NF;i++)
{ if($i~/^\$/)
{ printf "%s\n",substr($i,2) }
}
}' file.txt
这里我们对字段进行迭代(for (i=1;i<=NF;i++)
),如果字段以$
(if($i~/^\$/)
)开头,则从第二个字符()开始打印尾随换行符printf "%s\n",substr($i,2)
。
另一方面,如果字段数量固定且不是很多,那么sed
也是一个可行的选择,这里假设两个字段:
sed -nr 's/^\$([^[:blank:]]+)[[:blank:]]+\$([^[:blank:]]+)$/\1\n\2/p' file.txt
$
在每个空格分隔的字段的开头进行匹配,捕获该字段( ([^[:blank:]]+)
),然后在替换中将字段设置为换行符分隔(1\n\2
)。
例子:
$ cat file.txt
$PILOT_FIRSTNAME $PILOT_LASTNAME
$FOO $BAR
PILOT_FOO PILOT_BAR
$ awk '{for(i=1;i<=NF;i++){if($i~/^\$/){printf "%s\n",substr($i,2)}}}' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR
$ sed -nr 's/^\$([^[:blank:]]+)[[:blank:]]+\$([^[:blank:]]+)$/\1\n\2/p' file.txt
PILOT_FIRSTNAME
PILOT_LASTNAME
FOO
BAR