【问题标题】:Pattern conversion in UnixUnix 中的模式转换
【发布时间】:2021-10-01 03:49:10
【问题描述】:

我是shell脚本的新手,我有一个包含多条记录的文本文件,第一条记录结束和第二条记录在同一行开始,如下所示

"-}{"

所以我想打破链条

"-} #line1

{ #line2"

我尝试如下: 方法一

sed 's/\-\}\{//\-\} \n \{' file.txt

方法二

tr '-}{' '\n'

谁能帮我解决这个问题?

【问题讨论】:

    标签: unix awk sed tr


    【解决方案1】:

    使用您展示的示例,请尝试遵循awk 代码。只需将 -}{ 替换为 -} 新行 { 并打印值。

    echo '"-}{"' | awk '{sub(/-}{/,"-}\n{")} 1'
    

    【讨论】:

      【解决方案2】:

      转义太多。

      也是s/<pattern>/<replacement>/。有3个/,最后一个放在最后。

      $ echo '"-}{"' | sed 's/-}{/-} \n {/'
      "-} 
       {"
      

      tr 不可能,tr 用于单个字符翻译。如果您想使用tr -- '-}{' '\n',那么tr 将用换行符替换-}{ 中的任何一个。

      【讨论】:

        【解决方案3】:

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

        sed 'G;:a;s/-}\({.*\(.\)\)/-}\2\1/;ta;s/.$//' file
        

        在当前行添加一个换行符。

        使用模式匹配在-}{ 之间重复插入换行符。

        全部完成后,删除引入的换行符。

        【讨论】:

        • 为什么这么复杂而不是s/-}{/-} \n {/g'
        【解决方案4】:

        您可以使用() 捕获分隔符并执行以下操作:

        echo '"-}{" -}       -}{' | sed -E 's/(-})({)/\1\n\2/g'
        "-}
        {" -}       -}
        {
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-07-01
          • 1970-01-01
          • 2016-08-15
          • 1970-01-01
          • 1970-01-01
          • 2018-04-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多