【问题标题】:How to replace only specific spaces in a file using sed?如何使用 sed 仅替换文件中的特定空格?
【发布时间】:2021-08-19 07:20:57
【问题描述】:

我在一个文件中有这个内容,我想用管道符号 (|) 替换某些位置的空格。我为此使用了 sed,但它正在替换字符串中的所有空格。但我不想替换第 3 和第 4 个字符串的空格。

如何做到这一点?

输入:

test test test test

我的尝试:

sed -e 's/ /|/g file.txt

预期输出:

test|test|test test

实际输出:

test|test|test|test

【问题讨论】:

标签: sed


【解决方案1】:

如果原始输入不包含任何管道字符,您可以这样做

sed -e 's/ /|/g' -e 's/|/ /3' file

保留第三个空格。否则请参阅其他答案。

【讨论】:

    【解决方案2】:

    保持简单并使用 awk,例如在每个 Unix 机器上的任何 shell 中使用任何 awk,无论您的输入包含什么其他字符:

    $ awk '{for (i=1;i<NF;i++) sub(/ /,"|")} 1' file
    test|test|test test
    

    上面的内容替换了每一行上除了最后一个 " " 之外的所有内容。如果要替换特定数字,例如2,然后只需将NF更改为2即可。

    【讨论】:

      【解决方案3】:

      使用 GNU sed 替换第一个和第二个一个或多个空白块:

      sed -i -E 's/\s+/|/;s/\s+/|/' file
      

      请参阅online demo

      详情

      • -i - 内联替换开启
      • -E - 启用 POSIX ERE 语法
      • s/\s+/|/ - 替换第一个或多个空白字符
      • ; - 然后
      • s/\s+/|/ 每行的第二个或多个空格字符(如果存在)。

      【讨论】:

        【解决方案4】:

        您可以将“第一个空格”替换两次,例如

        sed -e 's/ /|/' -e 's/ /|/' file.txt
        

        或者,如果您想指定位置(例如,第 2 和第 1 个空格):

        sed -e 's/ /|/2' -e 's/ /|/1' file.txt
        

        【讨论】:

          【解决方案5】:
          sed 's/ /\
          /3;y/\n / |/'
          

          由于换行符不能出现在 sed 模式空间中,您可以将第三个空格更改为换行符,然后将所有换行符和空格更改为空格和管道。

          GNU sed 可以在替换文本中使用\n

          sed 's/ /\n/3;y/\n / |/'
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-02-17
            • 1970-01-01
            • 2012-01-11
            • 1970-01-01
            • 2021-05-13
            • 1970-01-01
            • 2014-11-27
            • 2018-04-07
            相关资源
            最近更新 更多