【问题标题】:Removing newlines between tokens删除标记之间的换行符
【发布时间】:2013-04-09 20:56:12
【问题描述】:

我有一个文件,其中包含一些跨越多行的信息。为了某些其他 bash 脚本我必须使用属性,我需要这些信息都在一行上。但是,我显然不想删除文件中的所有换行符。

我想要做的是替换换行符,但只在所有对 STARTINGTOKEN 和 ENDINGTOKEN 之间,这两个标记总是在不同的行上(但永远不会混淆在一起,例如不可能有两个 STARTINGTOKEN 连续在 ENDINGTOKEN 之前)。

我发现我可以删除换行符 tr "\n" " " 而且我还发现我可以在多行上匹配模式 sed -e '/STARTINGTOKEN/,/ENDINGTOKEN/!d'

但是,我不知道如何组合这些操作,同时保持文件的其余部分保持不变。

有什么建议吗?

【问题讨论】:

  • 如果您的数据允许,请删除所有换行符,然后将ENDINGTOKEN 替换为ENDINGTOKEN\n

标签: bash sed grep


【解决方案1】:

你在找这个吗?

 awk '/STARTINGTOKEN/{f=1} /ENDINGTOKEN/{f=0} {if(f)printf "%s",$0;else print}' file

示例:

kent$  cat file
foo
bar
STARTINGTOKEN xx
1
2
ENDINGTOKEN yy
3
4
STARTINGTOKEN mmm
5
6
7
nnn ENDINGTOKEN
8
9

kent$  awk '/STARTINGTOKEN/{f=1} /ENDINGTOKEN/{f=0} {if(f)printf "%s",$0;else print}' file
foo
bar
STARTINGTOKEN xx12ENDINGTOKEN yy
3
4
STARTINGTOKEN mmm567nnn ENDINGTOKEN
8
9

【讨论】:

    【解决方案2】:

    这似乎有效:

     sed -ne '/STARTINGTOKEN/{ :next ; /ENDINGTOKEN/!{N;b next;}; s/\n//g;p;}' "yourfile"
    

    一旦找到起始标记,它就会循环,拾取行,直到找到结束标记,然后删除所有嵌入的换行符并打印它。然后重复。

    【讨论】:

      【解决方案3】:

      使用 awk:

      awk '$0 ~ /STARTINGTOKEN/ || l {l=sprintf("%s%s", l, $0)} 
           /ENDINGTOKEN/{print l; l=""}' input.file
      

      【讨论】:

        【解决方案4】:

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

        sed '/STARTINGTOKEN/!b;:a;$bb;N;/ENDINGTOKEN/!ba;:b;s/\n//g' file
        

        或:

        sed -r '/(START|END)TOKEN/,//{/STARTINGTOKEN/{h;d};H;/ENDINGTOKEN/{x;s/\n//gp};d}' file
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-19
          • 2013-12-01
          • 1970-01-01
          • 2023-03-15
          • 2017-07-06
          • 1970-01-01
          • 1970-01-01
          • 2015-09-09
          相关资源
          最近更新 更多