【问题标题】:Replacing multiple bar (special char) with tab using sed使用 sed 用选项卡替换多个栏(特殊字符)
【发布时间】:2010-04-12 01:37:07
【问题描述】:

我有一个这样的字符串

BRADI5G20430|BRADI5G20430.1||1

如何用制表符(“\t”)替换栏(单个和多个)? 我试过了,但没用

sed 's/\|+/\t/g'

我也想在 bash 脚本中包含这一行。

【问题讨论】:

    标签: regex linux bash unix sed


    【解决方案1】:

    你需要转义+

    $ sed 's/|\+/\t/g' file
    BRADI5G20430    BRADI5G20430.1  1
    

    或者你可以使用 sed 的-r 选项,但是这一次,+ 将是“一个或多个”,你需要转义“|”因为在正则表达式中,它意味着交替。

    $ sed -r 's/\|+/\t/g' file
    BRADI5G20430    BRADI5G20430.1  1
    

    或使用awk,将字段分隔符设置为“|”然后将输出字段分隔符OFS 设置为制表符\t

    例如

    $ awk -F"|" '{$1=$1}1' OFS="\t" file
    BRADI5G20430    BRADI5G20430.1          1
    

    这会将每个选项卡替换为“|”。如果要替换所有“|”一个标签

    $ awk '{gsub(/\|+/,"\t")}1' file
    BRADI5G20430    BRADI5G20430.1  1
    

    【讨论】:

      【解决方案2】:

      我相信你正在寻找的命令实际上是

      sed -e 's/[|]\{1,\}/\t/g'
      

      Sed 不将+ 语法用于一个或多个,但允许您指定一个开放式的重复次数。请参阅here 了解更多信息。

      【讨论】:

      • sed 确实使用了+,如果不使用-r,你只需要转义它
      【解决方案3】:

      我不知道为什么+ 不起作用,但这会:

      $ echo  "BRADI5G20430|BRADI5G20430.1||1" | sed -e 's/\|\{1,\}/\t/g'
      BRADI5G20430\tBRADI5G20430.1\t1
      

      【讨论】:

        【解决方案4】:

        怎么没用?

        提示:如果您发现它不起作用,您应该能够看到您需要做什么才能使其起作用 - 尝试移除部分并查看行为如何变化。

        提示 #2:这是 sed 无法识别的 + 部分。

        sed 's/\|\|*/\t/g'

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-14
          • 2019-09-07
          • 2021-06-11
          • 1970-01-01
          • 1970-01-01
          • 2021-11-17
          相关资源
          最近更新 更多