【问题标题】:How do I extract a string that spans multiple lines with sed?如何使用 sed 提取跨越多行的字符串?
【发布时间】:2022-11-13 11:19:55
【问题描述】:

我需要提取CAKE_FROSTING("", 之间的字符串。如果字符串跨越多行,则必须删除行更改处的引号和换行符。我有一个命令(感谢stackoverflow)在那个方向上做了一些事情,但不完全是。我该如何修复它(你能简要解释一下修复)吗?我正在使用 Linux bash。

sed -En ':a;N;s/.*CAKE_FROSTING\(\n?\s*?"([^,]*).*/\1/p;ba' filesToCheck/* > result.txt

filesToCheck/file.h

something
CAKE_FROSTING(
"is supreme", 
"[i][agree]") something else
something more
something else
CAKE_FROSTING(
"is."kinda" neat"
"in fact", 
"[i][agree]") something else
something more

result.txt 当前

is supreme"
is."kinda" neat"

所需的结果.txt

is supreme
is."kinda" neat in fact

编辑:在@D_action 的帮助下,我现在有了

sed -En ':a;N;s/.*CAKE_FROSTING\(\n?\s*?"([^,]*).*,/\1/p;ba' filesToCheck/* > result.txt

这会产生几乎正确的输出,但是输出中有不必要的引号和一个太多的换行符:

result.txt 当前

is supreme" 
is."kinda" neat"
"in fact" 

【问题讨论】:

  • @anubhava 我会对 sed 解决方案感兴趣,因为它是我唯一至少知道一点点的解决方案,但是如果另一种解决方案更好/更容易/更快,那么这是受欢迎的。
  • 您需要添加一个逗号来表示您的匹配必须在逗号处停止。 *CAKE_FROSTING\(\n?\s*?"([^,]*).*,
  • 谢谢@D_action,这有帮助,我在编辑中将剩余的问题添加到帖子中。

标签: regex bash sed


【解决方案1】:

使用 GNU sed

$ sed -En ':a;N;s/.*CAKE_FROSTING(
?s"([^"]*[^
,]*)["].*
"([[:alpha:] ]+)?.*/ /p;ba' input_file
is supreme
is."kinda" neat in fact

【讨论】:

    【解决方案2】:

    这可能对您有用(GNU sed):

    sed '/^CAKE_FROSTING($/!d;z;:a;N;s/^"([^[].*)".*//mg;ta;s/^.(.*)
    .*//;y/
    / /' file
    

    关注那些包含CAKE_FROSTING( 的行并删除所有其他行。

    确定起点后,删除那条线,然后收集以下几条线,直到开始"[,边走边修边。

    删除初始换行符和不需要的最后一行。

    然后用空格替换任何剩余的换行符。

    【讨论】:

      【解决方案3】:

      您还可以在此处使用perl 匹配CAKE_FROSTING() 之间的字符串,并从行的开头/结尾删除双引号,并仅在匹配项内用空格替换换行符:

      perl -0777 -ne 'while (/CAKE_FROSTING(s*"([^,]*)"/g) {$a=$1; $a =~ s/^"|"$|(R+)/$1?" ":""/gme; print "$a
      "}' file
      

      请参阅online demo。请注意,-0777 会删除文件,以便正则表达式引擎可以“看到”换行符。

      CAKE_FROSTING(s*"([^,]*)" 模式匹配 CAKE_FROSTING(、零个或多个空格、",然后将任何零个或多个非逗号字符捕获到组 1 中,直到最右边的 "

      $a=$1; $a =~ s/^"|"$|(R+)/$1?" ":""/gme; print "$a " 部分将 Group 1 值分配给 $a 变量,^"|"$|(R+) 匹配位于行尾或捕获一个或多个换行符 (R+) 的 "s 到 Group 1如果第 1 组匹配,则替换为空格,否则为空字符串。仅打印 $a 变量的内容。

      【讨论】:

        猜你喜欢
        • 2020-04-14
        • 2013-05-16
        • 2016-11-14
        • 2021-11-18
        • 1970-01-01
        • 2021-12-14
        • 2014-08-21
        • 1970-01-01
        • 2016-08-25
        相关资源
        最近更新 更多