使用bash(bashawk,sed)读取文件并提取引号之间的单词匹配前缀
我有一个包含(每行一个)的文件。我想从一些模式开始提取引号之间的单词。(在我的例子中,它是C_) 我想提取:使用bash(bashawk,sed)读取文件并提取引号之间的单词匹配前缀,bash,scripting,sed,awk,grep,Bash,Scripting,Sed,Awk,Grep,我有一个包含(每行一个)的文件。我想从一些模式开始提取引号之间的单词。(在我的例子中,它是C_) 我想提取:PATTERNabcdePATTERNabc 编辑: 我还想在引号之间提取不以$PATTERN开头的单词 sed -rn 's/.*?".*?(PATTERN[^"]*)".*/\1/p' -r-扩展正则表达式 -n-禁用自动打印 *?-零个或多个字符,非贪婪 (-打开捕获组 [^”]-除“ )-关闭捕获组 \1-第一个匹配组 p-打印 我们只是用第一组替换每一行。如果有替换,我们将
PATTERNabcde
PATTERNabc
编辑:我还想在引号之间提取不以
$PATTERN
开头的单词
sed -rn 's/.*?".*?(PATTERN[^"]*)".*/\1/p'
-扩展正则表达式-r
-禁用自动打印-n
-零个或多个字符,非贪婪*?
-打开捕获组(
-除[^”]
“
-关闭捕获组)
-第一个匹配组\1
-打印p
-扩展正则表达式-r
-禁用自动打印-n
-零个或多个字符,非贪婪*?
-打开捕获组(
-除[^”]
“
-关闭捕获组)
-第一个匹配组\1
-打印p
我们只是用第一组替换每一行。如果有替换,我们将打印。您可以使用
grep
作为:
grep -Po '(?<=")\s*PATTERN[^"]*(?=")' file
grep-Po'(?您可以使用grep
作为:
grep -Po '(?<=")\s*PATTERN[^"]*(?=")' file
grep-Po'(?您可以使用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}}'
awk-F\“{for(i=2;i您可以使用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}}'
awk-F\“{for(i=2;虽然它在${PATTERN}abc${PATTERN}ghi上失败,但这很好”它回来了$PATTERNghi@vehom,您没有说每行可以有多个。对不起,我说它以括号之间的$PATTERN开头,这意味着任何东西都可以跟随$PATTERN,包括$PATTERN,只要单词在结束括号之前结束。并且每行只匹配一个单词。我仍然高估了您的答案=)@vehom,你的问题中没有括号。另外,请解释你的sed的一些部分,例如?.?和“.*/\1..谢谢这很好,尽管它在“${PATTERN}abc${PATTERN}ghi”上失败了它回来了$PATTERNghi@vehom,您没有说每行可以有多个。对不起,我说它以括号之间的$PATTERN开头,这意味着任何东西都可以跟随$PATTERN,包括$PATTERN,只要单词在结束括号之前结束。并且每行只匹配一个单词。我仍然高估了您的答案=)@vehom,你的问题中没有括号。另外,请解释你的sed的一些部分,例如?.?和“”。*/\1..谢谢什么括号?你是指引号?什么括号?你是指引号吗?“F\”强制awk使用“作为字段分隔符;然后对于每一行,如果第二个字段(引号中包含的单词标记)以零个或多个空格开头,后跟图案,它将简单地打印出来。-F \“强制awk使用”作为字段分隔符;然后对于每一行,如果第二个字段(用引号括起来的单词)以零个或多个空格开头,后跟图案,它将简单地打印出来。