删除多个空格-Unix脚本

时间:2019-02-12 20:34:10

标签: unix sed tr

从我的shell脚本中,我试图删除重复的空格,但看来

tr -s " " < input.txt > output.txt 

不起作用。还有什么其他方法可以从shell脚本中将多个连续的空格删除为单个空格。

我正在尝试从内容中删除空格

1     | First         | PO BOX 123        | DAYTON          | OH            | 3432-222
2     | Second        | PO BOX 2223       | CALIFORNIA      | CA            | 23423 
3     | THIRD         | PO BOX 21         | COLUMBUS        | OH            | 2223

进入此

1|First|PO BOX 123|DAYTON|OH|3432-222
2|Second|PO BOX 2223|CALIFORNIA|CA|23423
3|THIRD|PO BOX 21|COLUMBUS|OH|2223

4 个答案:

答案 0 :(得分:3)

使用最少的z-index

sed

输出:

sed 's/ *| */|/g' input.txt 

注意:这在功能上与 PaulProgrammer 的答案相同,但是由于 input.txt 的空白纯粹是事实,因此简化了代码空格“ {1|First|PO BOX 123|DAYTON|OH|3432-222 2|Second|PO BOX 2223|CALIFORNIA|CA|23423 3|THIRD|PO BOX 21|COLUMBUS|OH|2223 ”字符(无标签,)。

答案 1 :(得分:2)

尝试使用sed代替tr

sed 's/[[:blank:]]\{1,\}|[[:blank:]]\{1,\}/|/g' < input > output

或者,在perl中:

perl -ne 's#\s+\|\s+#|#g; print;' input > output

答案 2 :(得分:1)

我喜欢将awk用于具有记录的内容。 tr tr 附加文本,sed s tream的 ed itor,但是awk了解记录,字段,字段分隔符等的概念。

因此,为了完成您的选择集,以下是最小化awk的解决方案:

$ awk -F ' *\\| *' '{$1=$1} 1' OFS='|' input.txt
1|First|PO BOX 123|DAYTON|OH|3432-222
2|Second|PO BOX 2223|CALIFORNIA|CA|23423
3|THIRD|PO BOX 21|COLUMBUS|OH|2223

这将使用-F设置输入字段分隔符,并使用OFS设置输出字段分隔符。该脚本由一个导致记录用OFS重写的语句和一个用于打印该行的语句(1快捷方式)组成。

请注意-F选项中竖线的怪异转义。如果要使用此功能,为避免混淆,您可能希望改为awk -F ' *[|] *' ...

要变得更短以牺牲清晰度为代价,您还可以使用:

$ awk -F ' *[|] *' '$1=$1' OFS='|' input.txt

这会将记录重写语句变为始终返回true的条件,从而消除了对1快捷方式的需要。虽然它可以减少脚本中的几个字符,但我只是出于娱乐目的而包含它。最好使用不会在一两年内重读的代码。 ;)

答案 3 :(得分:0)

我必须在 /etc/servicesfile 中做类似的事情。

没有一种 sed 方法对我有用(在这个问题和许多其他问题上)。

tr -s " " 也什么也没做 tr -s "\t" 删除了一些空格(将其流水线化为 tr -s " " 也没有做任何事情)

我发现的一个解决方案是使用“column -t”

 column -t /etc/services | tr -s " " 

据我所知(可能是错误的) column 命令创建了一个表。 -t 定义了列的数量(我认为没有指定,因为它来自输入文件)。然后我可以用 'tr -s " "' 删除所有多余的空格。