【问题标题】:Adding blank line spaces before and after pattern 'string' match在模式“字符串”匹配之前和之后添加空白行
【发布时间】:2021-04-17 16:46:37
【问题描述】:

我试图在字符串模式匹配之前和之后在文本文件 (text.txt) 中添加 5 个空白行。我使用以下内容在对我有用的“字符串”匹配之后获取空格-

sed '/string/{G;G;G;G;G;}' text.txt

我想应用相同的 sed 命令在“字符串”之前获得 5 个空行这里我不想要空格,而是在它们之前和之后的空行。有什么建议吗?

【问题讨论】:

  • 试试sed -e '/string/{ s/^/\n\n\n\n\n/; s/$/\n\n\n\n\n/ }' text.txt

标签: regex linux sed


【解决方案1】:

还有一个awk 版本:

awk '{if(/string1|string2|.../){printf "\n\n\n\n\n%s\n\n\n\n\n",$0}else{print}}' file

【讨论】:

    【解决方案2】:

    这可能对你有用:

    sed '/string/{G;s/\(string\)\(.*\)\(.\)/\3\3\3\3\3\1\3\3\3\3\3\2/}' file
    

    string 上匹配,追加一个空行,使用换行符进行模式匹配,以将匹配的两边分开 5 行。

    【讨论】:

      【解决方案3】:

      对于单个字符串匹配:

      $ sed -e '/string/{ s/^/\n\n\n\n\n/; s/$/\n\n\n\n\n/ }' text.txt 
      

      对于多个字符串,假设要求相同:

      $ sed -E '/(string1|string2|string3)/{ s/^/\n\n\n\n\n/; s/$/\n\n\n\n\n/ }' text.txt
      

      【讨论】:

        【解决方案4】:
        sed -r 's/(^.*)(string)(.*$)/\1\n\n\n\n\n\2\n\n\n\n\n\3/' text.txt
        

        使用 -r 或 -E 允许正则表达式,将喜欢的内容分成三部分,然后用该行替换第一部分,5 个新行,第二个部分,5 个新行,最后是第三部分。

        【讨论】:

        • 假设如果我想在同一个 text.txt 中使用许多字符串来处理“字符串 1”、“字符串 2”和“字符串 3”。如何修改?
        • 使用-r-E 启用ERE(扩展正则表达式)。为了获得最大的可移植性,根据 POSIX,使用 -E
        • 也许sed 's/string1\|string2\|string3/\n\n\n\n\n&\n\n\n\n\n/g' file 可以用于 GNU sed?
        【解决方案5】:

        使用这个 Perl 单行代码:

        perl -pe 's/string/\n\n\n\n\n$&\n\n\n\n\n/' text.txt
        

        Perl 单行代码使用这些命令行标志:
        -e:告诉 Perl 查找内联代码,而不是在文件中。
        -p:循环输入一行一次,默认分配给$_。在每次循环迭代后添加print $_

        s/PATTERN/REPLACEMENT/ :将 PATTERN 更改为 REPLACEMENT
        $& :匹配模式。
        \n :换行符。

        另请参阅:
        perldoc perlrun: how to execute the Perl interpreter: command line switches
        perldoc perlrequick: Perl regular expressions quick start

        【讨论】: