从我的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
我喜欢用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
快捷方式的需要。虽然它削减了剧本中的一些字符,但我只是为了好玩而加入它;更好地使用代码,当你在一两年内重新阅读它时不会让你挠头。 ;)
使用最小的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的空格是纯粹的空间“”字符,所以简化了(没有标签,等等)。
尝试使用sed
而不是tr
:
sed 's/[[:blank:]]\{1,\}|[[:blank:]]\{1,\}/|/g' < input > output
或者,在perl中:
perl -ne 's#\s+\|\s+#|#g; print;' input > output