【问题标题】:Insert linebreak in a file after a string在字符串后的文件中插入换行符
【发布时间】:2021-05-03 01:57:06
【问题描述】:

我有一个独特的(对我而言)情况: 我有一个文件 - file.txt 包含以下数据:

"Line1", "Line2", "Line3", "Line4"

我想在每次找到", 模式时插入一个换行符。 file.txt 的输出应如下所示:

"Line1", 
"Line2", 
"Line3", 
"Line4"

我很难逃脱", 。 我试过sed -i -e "s/\",/\n/g" file.txt,但没有得到想要的结果。

我正在寻找使用perlsed 的单班轮。

【问题讨论】:

    标签: perl sed


    【解决方案1】:

    你可以使用这个gnu sed:

    sed -E 's/(",)[[:blank:]]*/\1\n/g' file.txt
    
    "Line1",
    "Line2",
    "Line3",
    "Line4"
    

    注意如何在sed 命令中使用单引号来避免不必要的转义。

    如果您没有gnu sed,那么这里是一个符合 POSIX 的sed 解决方案:

    sed -E 's/(",)[[:blank:]]*/\1\
    /g' file.txt
    

    要在线保存更改,请使用:

    sed -i.bak -E 's/(",)[[:blank:]]*/\1\
    /g' file.txt
    

    【讨论】:

    • 这两个命令都适用于 RHEL 7.9+。但是当我在运行 BigSur 的 Mac 上运行相同的命令时,该命令不会更新文件,只会在屏幕上显示输出
    • 检查更新的答案以在 Mac 上保存更改。顺便说一句,我也在 mac 上测试
    • @anubhava,您好先生,请您投票重新打开帖子stackoverflow.com/questions/65901773/…不知道为什么它被删除了。
    【解决方案2】:

    请您尝试以下操作。在这里使用awk 的替换机制,以防你对awk 没问题。

    awk -v s1="\"" -v s2="," '{gsub(/",[[:blank:]]+"/,s1 s2 ORS s1)} 1' Input_file
    

    【讨论】:

      【解决方案3】:

      使用这个 Perl 单行代码:

      perl -F'/"\K,\s*/' -lane 'print join ",\n", @F;' in_file > out_file
      

      或者这个用于在线替换:

      perl -i.bak -F'/"\K,\s*/' -lane 'print join ",\n", @F;' in_file
      

      Perl 单行代码使用这些命令行标志:
      -e:告诉 Perl 查找内联代码,而不是在文件中。
      -n:循环输入一行一次,默认将其分配给 $_
      -l :在执行内联代码之前剥离输入行分隔符(默认为 *NIX 上的 "\n"),并在打印时附加它。-a : 在空格或-F 选项中指定的正则表达式上将$_ 拆分为数组@F
      -F'/"\K,\s*/' : 在双引号中拆分为@F,后跟逗号,然后通过 0 个或多个空格字符,而不是空格。 \K :导致正则表达式引擎“保留”它在 \K 之前匹配的所有内容,而不是将其包含在匹配中。这会导致在 @F 元素中保留双引号,而在拆分期间删除逗号和空格。
      -i.bak :就地编辑输入文件(覆盖输入文件)。在覆盖之前,保存原始文件的备份副本,方法是在其名称后附加扩展名 .bak

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

      【讨论】:

      • @briandfoy 感谢您提出考虑双引号的建议。更新了答案。
      【解决方案4】:

      这是一个 Perl 解决方案:

      perl -pe 's/",\K/\n/g' file.txt
      

      替换模式与", 匹配,但\K 表示忽略左侧的任何内容以进行替换(因此,",)不会被替换。然后替换有效地插入换行符。

      我在-e 的参数中使用了单引号,但这在必须使用" 的Windows 上不起作用。除了转义",您还可以通过其他方式指定它。那是代码号0x22,所以你可以写:

      perl -pe "s/\x22,\K/\n/g" file.txt
      

      或八进制:

      perl -pe "s/\042,\K/\n/g" file.txt
      

      【讨论】:

        猜你喜欢
        • 2014-03-11
        • 1970-01-01
        • 2011-05-04
        • 2015-04-05
        • 2017-11-14
        • 2013-05-23
        • 1970-01-01
        • 2019-09-14
        • 1970-01-01
        相关资源
        最近更新 更多