删除多个空格 - Unix脚本

问题描述 投票:1回答:3

从我的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
unix sed tr
3个回答
1
投票

我喜欢用awk来记录那些有记录的东西。 tr翻译文本,sed是一个流编辑器,但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
投票

使用最小的sed

sed 's/ *| */|/g' 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

注意:这在功能上与PaulProgrammer的答案相同,但由于input.txt的空格是纯粹的空间“”字符,所以简化了(没有标签,等等)。


2
投票

尝试使用sed而不是tr

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

或者,在perl中:

perl -ne 's#\s+\|\s+#|#g; print;' input > output
© www.soinside.com 2019 - 2024. All rights reserved.