Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
删除多个空格-Unix脚本_Unix_Sed_Tr - Fatal编程技术网

删除多个空格-Unix脚本

删除多个空格-Unix脚本,unix,sed,tr,Unix,Sed,Tr,从我的shell脚本中,我试图删除重复的空格,但似乎 tr -s " " < input.txt > output.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 尝试使用sed而不是tr: 尝试使用sed而不是tr: 使用最小sed: 输出: 1|First|PO BOX 123|

从我的shell脚本中,我试图删除重复的空格,但似乎

tr -s " " < input.txt > output.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
尝试使用sed而不是tr:

尝试使用sed而不是tr:

使用最小sed:

输出:

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的空格纯粹是空格字符,没有制表符等,因此简化了它。

使用最小sed:

输出:

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的空白纯粹是空格字符,没有制表符等,因此简化了。我喜欢使用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重写记录,该语句是打印行的快捷方式

请注意-F选项中垂直条的奇怪转义。如果要使用此选项,为了避免混淆,您可能需要awk-F'*[|]*'。。。相反

为了更简短,但却以清晰度为代价,您还可以使用:

$ awk -F ' *[|] *' '$1=$1' OFS='|' input.txt

这将把recordrewrite语句变成一个应该始终返回true的条件,从而消除了对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重写记录,该语句是打印行的快捷方式

请注意-F选项中垂直条的奇怪转义。如果要使用此选项,为了避免混淆,您可能需要awk-F'*[|]*'。。。相反

为了更简短,但却以清晰度为代价,您还可以使用:

$ awk -F ' *[|] *' '$1=$1' OFS='|' input.txt

这将把recordrewrite语句变成一个应该始终返回true的条件,从而消除了对1快捷方式的需要。虽然它从脚本中删去了几个字符,但我把它包括进来只是为了好玩;在一两年内重新阅读时,最好使用不会让你挠头的代码

我必须在/etc/servicesfile中执行类似的操作

在这个问题和其他许多问题上,sed方法都不适用于我

tr-s也没有做任何事情 tr-s\t删除了一些空白,通过管道将其传输到tr-s,但也没有执行任何操作

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

 column -t /etc/services | tr -s " " 
据我所知,column命令创建表可能是错误的。
t定义了我认为没有指定的列的数量,因为它来自输入文件。然后我可以用“tr-s”删除所有多余的空格。

我必须在/etc/servicesfile中执行类似的操作

在这个问题和其他许多问题上,sed方法都不适用于我

tr-s也没有做任何事情 tr-s\t删除了一些空白,通过管道将其传输到tr-s,但也没有执行任何操作

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

 column -t /etc/services | tr -s " " 
据我所知,column命令创建表可能是错误的。
t定义了我认为没有指定的列的数量,因为它来自输入文件。然后我可以用“tr-s”删除所有多余的空格。

尝试使用-r标志,一些Linux系统需要它来扩展正则表达式:比如sed-r的/\s*\\\\s*/|/g'output.txt\s是对正则表达式的GNU-sed扩展。此外,+是扩展正则表达式sed-E/sed-r的一部分,或者作为GNU sed中BRE的扩展而受支持,但必须转义。所以:GNU-sed,BRE:sed's/\s\+/\s\+//g',或者GNU-sed,ERE:sed-E's/\s+//g'现在必须被转义!,或者POSIX:sed的/[:blank:]\{1,\}{124;[[:blank:]\{1,\}/}/g'尝试了提供的所有建议,但似乎没有任何效果。不幸的是,不能使用perl,必须在shell脚本中。操作系统版本重要吗?我使用的是Oracle Enterprise Linux 2.6.39。我相信我的问题与该命令的预期不同。看起来文本文件是在windows中创建的,后来被移动到了unix,这也是sed和tr命令无法工作的原因。文件是在unix中重新生成的,使用提供的命令似乎可以解决此问题。请尝试使用-r标志,某些Linux系统需要它来扩展正则表达式:例如sed-r的/\s*\\s*/\g'output.txt\s是对正则表达式的GNU-sed扩展。此外,+是扩展正则表达式的一部分
SINS sed-E/sed-r,或作为GNU sed中BRE的扩展支持,但必须转义。所以:GNU-sed,BRE:sed's/\s\+/\s\+//g',或者GNU-sed,ERE:sed-E's/\s+//g'现在必须被转义!,或者POSIX:sed的/[:blank:]\{1,\}{124;[[:blank:]\{1,\}/}/g'尝试了提供的所有建议,但似乎没有任何效果。不幸的是,不能使用perl,必须在shell脚本中。操作系统版本重要吗?我使用的是Oracle Enterprise Linux 2.6.39。我相信我的问题与该命令的预期不同。看起来文本文件是在windows中创建的,后来被移动到了unix,这也是sed和tr命令无法工作的原因。文件是在unix中重新生成的,使用提供的命令似乎可以解决此问题。您确定输入有空格吗?tr应该起作用。请尝试tr-d“[:blank:]”再次查看,您真正想要的似乎只是tr-d\\t,删除tabstr-d“[:blank:]”有效,但它也在删除地址中的空格。您使用的是什么shell?您确定输入有空格吗?tr应该起作用。尝试tr-d'[:blank:'再次查看,看起来您真正想要的只是tr-d\\t,删除tabstr-d'[:blank:'有效,但它也删除了地址中的空格。您使用的shell是什么?