我的文本文件包含以下行(实际上更长):
U-what's-WORD|C U--PW|C U-you-NW|C U-what's--W-PW|C U-PROGRAM-GAZ|C
U-timothy-WORD|C U--PW|C U-green-NW|C U-timothy--W-PW|C
U-life-WORD|C U-odd-PW|C U--NW|C U-life-odd-W-PW|C
U-green-PW|C U-life-NW|C U-PROGRAM-GAZ|C U-odd-green-W-PW|C
U-green-xxxxk-DISJP-CS|C U-timothy-xxxxk-DISJP-CS|C U-PROGRAM-GAZ1|C U-PROGRAM-GAZ|C
我想打印只包含“GAZ”的所有单词。如果一行不包含任何此类单词,请打印空行。
我尝试用grep搜索,但它匹配并打印整行。我试图在sed中使用带有边界的捕获组(\ b。 P。 \ b)并打印该组\ 1无效。
EDIT 一个简单的方法(我不想实现)是编写一个python脚本。该脚本将逐行工作:
答案 0 :(得分:1)
这会在符合模式P
的行中打印任何单词。如果未找到任何单词,则会打印一个空行:
$ awk -v P=GAZ '{for (i=1;i<=NF;i++) if($i~P)printf "%s ",$i; print ""}' file
U-PROGRAM-GAZ|C
U-PROGRAM-GAZ|C
U-PROGRAM-GAZ1|C U-PROGRAM-GAZ|C
-v P=GAZ
这定义了模式P
。 P
可能是正则表达式。
for (i=1;i<=NF;i++) if ($i ~ P) printf "%s ",$i
这会遍历该行上的每个单词。如果该单词与模式P
匹配(P
可能是正则表达式),则会打印该单词。
print ""
在每一行的末尾,无论是否匹配,都会打印换行符。
答案 1 :(得分:1)
我假设一个&#34;字&#34;是一个非空白的序列。这里的关键是grep的-o
选项只显示正则表达式匹配的内容,而不是整行。
while IFS= read -r line; do
grep -oP '\S*GAZ\S*' <<< "$line" | tr '\n' ' '
echo
done < file
U-PROGRAM-GAZ|C
U-PROGRAM-GAZ|C
U-PROGRAM-GAZ1|C U-PROGRAM-GAZ|C
答案 2 :(得分:0)
sed 's/.*/ & /;s/ / /g;s/GAZ/³/g;s/ [^ ³]\{1,\} / /g;s/³/GAZ/g;s/ */ /;s/.\(.*\)./\1/' YourFile
³
(可以使用其他临时字符或添加转义序列,稍微重一点)<强>普林西:强>
GAZ
替换为³
并排除{i}个单一univoq字符串排除³
,然后将GAZ
放回去。 / LI>