从我的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
答案 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 " "' 删除所有多余的空格。