使用bash(bash awk,sed)读取文件并在引号之间提取匹配前缀的单词

时间:2010-12-15 01:53:03

标签: bash scripting sed awk grep

我有一个文件包含(每行一个)。我想从一些模式开始在引号之间提取单词。 (在我的例子中是C _)

"PATTERNabcde"  sdfds  sdfds
"sdfsdfsdf"   sdfdsf sdfdsf
" PATTERNabc"          dfdsdfd

我要提取:PATTERNabcde PATTERNabc

修改
我想在不以$PATTERN开头的引号之间提取单词。

3 个答案:

答案 0 :(得分:2)

sed -rn 's/.*?".*?(PATTERN[^"]*)".*/\1/p'
  • -r - 扩展正则表达式
  • -n - 已禁用自动打印
  • .*? - 零个或多个字符,非贪婪
  • ( - 开放捕获组
  • [^"] - 除"
  • 之外的任何字符
  • ) - 关闭捕获组
  • \1 - 第一个匹配组
  • p - 打印

我们只需用第一组替换每一行。如果有更换,我们打印。

答案 1 :(得分:2)

您可以将grep用作:

grep -Po '(?<=")\s*PATTERN[^"]*(?=")' file

See it

答案 2 :(得分:2)

您可以使用awk:

awk -F\" '$2~/^[[:space:]]*PATTERN/{print $2}' file

如果引号中只包含一个单词,或者可能以pattern开头的单词始终是第一个单词,则此方法有效;否则,你必须使用for循环:

awk -F\" '{for (i=2;i<=NF;i+=2) if ($i ~/^[[:space:]]*PATTERN/ ) {print $i;next}}'