匹配并打印与长字符串中的某些模式匹配的所有单词

时间:2015-01-14 01:19:30

标签: regex sed grep

我的文本文件包含以下行(实际上更长):

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脚本。该脚本将逐行工作:

  1. 使用空格分隔符
  2. 对字符串进行标记化
  3. 将每个标记与模式P匹配,并在匹配时打印
  4. 如果整行没有匹配,只需打印空行

3 个答案:

答案 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

    这定义了模式PP可能是正则表达式。

  • 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
  • 对于posix sed(没有不是这个组正则表达式可用)
  • 假设字符串中没有³(可以使用其他临时字符或添加转义序列,稍微重一点)

<强>普林西:

  • 删除行中没有GAZ的群组
  • 因为GAZ不能作为排除选择,所以将GAZ替换为³并排除{i}个单一univoq字符串排除³,然后将GAZ放回去。 / LI>
  • 调整字符串以便于选择(在开始和结束时添加空格,双倍空格)并在末尾重新格式化