删除多个空格 - Unix 脚本

Remove multiple Spaces - Unix Script

我试图从我的 shell 脚本中删除重复的白色 space,但似乎

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

不工作。有没有其他方法可以从 shell 脚本中删除多个连续的空白 space 到单个空白 space。

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

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

尝试使用 sed 而不是 tr:

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

或者,在 perl 中:

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

使用最小 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

注意:这在功能上与 的答案相同,但由于 input.txt 的事实而被简化 的白色 space 纯粹是 space "" 字符,(没有制表符, ).

我喜欢将 awk 用于有记录的事物。 tr translates 文本,sedstream editor , 但 awk 理解记录、字段、字段分隔符等概念

因此,为了完成您的选项集,这里有一个最小 awk 的解决方案:

$ awk -F ' *\| *' '{=} 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 ' *[|] *' '=' OFS='|' input.txt

这会将记录重写语句变成一个条件,该条件应始终 return 为真,从而消除了对 1 快捷方式的需要。虽然它从脚本中删除了几个字符,但我只是为了好玩才包含它;使用不会让您在一两年内重新阅读时挠头的代码要好得多。 ;)

我不得不在 /etc/servicesfile 中做这样的事情。

None 的 sed 方法对我有用(关于这个问题和许多其他问题)。

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

我找到的解决方案是使用 'column -t'

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

据我了解(可能是错误的)列命令创建了一个 table。 -t 定义列的数量(我认为未指定,因为它来自输入文件)。然后我可以用 'tr -s " "'.

删除所有多余的空格