【问题标题】:Using bash (bash awk, sed) read a file and extract word matching prefix between quotes使用 bash (bash awk, sed) 读取文件并提取引号之间的单词匹配前缀
【发布时间】:2010-12-15 01:53:02
【问题描述】:

我有一个包含(每行一个)的文件。我想提取以某种模式开头的引号之间的单词。 (在我的例子中是 C_)

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

我想提取:PATTERNabcdePATTERNabc

编辑:
我还想提取不以$PATTERN 开头的引号之间的单词。

【问题讨论】:

  • 什么括号?你的意思是引号吗?

标签: bash scripting sed awk grep


【解决方案1】:

你可以使用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}}'

【讨论】:

  • -F\" 强制 awk 使用 " 作为字段分隔符;那么对于每一行,如果第二个字段(用引号括起来的单词)以零个或多个空格开头,后跟 PATTERN,它会简单地将其打印出来。
【解决方案2】:
sed -rn 's/.*?".*?(PATTERN[^"]*)".*/\1/p'
  • -r - 扩展正则表达式
  • -n - 禁用自动打印
  • .*? - 零个或多个字符,非贪婪
  • ( - 打开捕获组
  • [^"] - 除" 以外的任何字符
  • ) - 关闭捕获组
  • \1 - 第一个匹配组
  • p - 打印

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

【讨论】:

  • 这很好,虽然它在 "${PATTERN}abc${PATTERN}ghi" 上失败,但它返回 $PATTERNghi
  • @vehom,你没有说每行可能不止一个。
  • 对不起,我说它以括号之间的 $PATTERN 开头,这意味着只要单词在右括号之前结束,任何东西都可以跟随在 $PATTERN 之后,包括 $PATTERN。并且每行只匹配一个单词。我仍然赞成你的回答=)
  • @vehom,你的问题中没有括号。
  • 还请解释一下您的 sed 的某些部分,例如 ?".? 和 )".*/\1.. 谢谢
【解决方案3】:

您可以将grep 用作:

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

See it

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-01
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2013-11-09
    • 2013-01-07
    • 2018-04-29
    • 2012-08-01
    相关资源
    最近更新 更多