使用sed替换多个bar(特殊字符)

时间:2010-04-12 01:37:08

标签: regex linux bash unix sed

我有一个像这样的字符串

BRADI5G20430|BRADI5G20430.1||1

如何用标签(“\ t”)替换条形图(单个和多个)? 我尝试了这个但是没有工作

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

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

4 个答案:

答案 0 :(得分:3)

你需要逃避+

$ 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

答案 1 :(得分:2)

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

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

Sed不会将+语法用于一个或多个,但允许您指定一个开放式的重复数。有关详细信息,请参阅here

答案 2 :(得分:1)

我不确定为什么+不起作用,但这会:

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

答案 3 :(得分:1)

它是如何工作的?

提示:如果你看到它不起作用,你应该能够看到你需要做些什么来使它工作 - 尝试删除部分并看看行为如何变化。

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

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