删除多个空格 - 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 文本,sed
是 stream 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 " "'.
删除所有多余的空格
我试图从我的 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
注意:这在功能上与 " 字符,(没有制表符, 等 ).
我喜欢将 awk 用于有记录的事物。 tr
translates 文本,sed
是 stream 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 " "'.
删除所有多余的空格