Unix 如何在所有文本文件中删除/添加空格?

Unix 如何在所有文本文件中删除/添加空格?,unix,sed,whitespace,Unix,Sed,Whitespace,我有几个类似的文件,例如,test.in: apple foo bar hello world 我需要实现这个期望的输出,每个字符后面都有一个空格: a p p l e f o o b a r h e l l o w o r l d 我想我可能会先删除所有空格,然后为每个字符添加空格,如下所示: sed 's/\s//g' test.in | sed -e 's/\(.\)/\1 /g' 但是还有其他方法吗?这个awk可以: awk -v FS="" '{gsub(/ /,"");$1=$

我有几个类似的文件,例如,
test.in

apple foo bar
hello world
我需要实现这个期望的输出,每个字符后面都有一个空格:

a p p l e f o o b a r
h e l l o w o r l d
我想我可能会先删除所有空格,然后为每个字符添加空格,如下所示:

sed 's/\s//g' test.in | sed -e 's/\(.\)/\1 /g'

但是还有其他方法吗?

这个
awk
可以:

awk -v FS="" '{gsub(/ /,"");$1=$1}1' file
a p p l e f o o b a r
h e l l o w o r l d
首先删除所有空格,然后由于
FS
(字段分隔符)设置为空,因此
$1=$1
用一个空格重建所有字段

这不会像这里的大多数其他
sed
perl
命令那样在末尾添加空格


或者基于此处发布的
sed

awk '{gsub(/ /,"");gsub(/./,"& ")}1' file
a p p l e f o o b a r
h e l l o w o r l d

awk
可执行以下操作:

awk -v FS="" '{gsub(/ /,"");$1=$1}1' file
a p p l e f o o b a r
h e l l o w o r l d
首先删除所有空格,然后由于
FS
(字段分隔符)设置为空,因此
$1=$1
用一个空格重建所有字段

这不会像这里的大多数其他
sed
perl
命令那样在末尾添加空格


或者基于此处发布的
sed

awk '{gsub(/ /,"");gsub(/./,"& ")}1' file
a p p l e f o o b a r
h e l l o w o r l d
通过perl

$ perl -ple 's/([^ ]|^)(?! )/\1 /g' file
a p p l e f o o b a r 
h e l l o w o r l d 
添加内联编辑选项
-i
以保存所做的更改

perl -i -ple 's/([^ ]|^)(?! )/\1 /g' file
通过perl

$ perl -ple 's/([^ ]|^)(?! )/\1 /g' file
a p p l e f o o b a r 
h e l l o w o r l d 
添加内联编辑选项
-i
以保存所做的更改

perl -i -ple 's/([^ ]|^)(?! )/\1 /g' file

sed的///g;s/&/g'文件名


&
:指与sed的///g匹配的模式空间部分;s/&/g'文件名


&
:指与
sed匹配的模式空间部分,或者类似的部分:

$ sed 's/./& /g;s/  //g' file
a p p l e f o o b a r
h e l l o w o r l d

或者类似于sed的
sed

$ sed 's/./& /g;s/  //g' file
a p p l e f o o b a r
h e l l o w o r l d

您可以将两个
sed
命令组合成一个命令:

$ sed 's/\s//g;s/./& /g' test.in 
a p p l e f o o b a r 
h e l l o w o r l d 
注意使用
&
而不是
\(.\)
\1

在不支持
\s
指定匹配空白的系统上,您可以使用
[[::blank::]

$ sed 's/[[:blank:]]//g;s/./& /g' test.in 
a p p l e f o o b a r 
h e l l o w o r l d 

您可以将两个
sed
命令组合成一个命令:

$ sed 's/\s//g;s/./& /g' test.in 
a p p l e f o o b a r 
h e l l o w o r l d 
注意使用
&
而不是
\(.\)
\1

在不支持
\s
指定匹配空白的系统上,您可以使用
[[::blank::]

$ sed 's/[[:blank:]]//g;s/./& /g' test.in 
a p p l e f o o b a r 
h e l l o w o r l d 
这可能适用于您(GNU-sed):

这可能适用于您(GNU-sed):



因此,在最后一个字符之后需要空格。在每个Acharacter之后,在最后一个字符之后需要空格。在每个Acharacter之后,此输出中有两个空格。@alvas删除了额外的空格。在这个输出中有两个空格。@alvas删除了额外的空格。或者此
sed的///g;s//&/g'
或此
sed的///g;s//&/g'
这与发布的user2196728大致相同。@Jotne:同一时间,但我特别合并了OP的原始命令。现在看。删除了我的评论。请注意,并非所有版本的
sed
都支持
\s
表示“空格”。考虑冗长但灵活的<代码> [[::空间:] /<代码>或>代码> [[:空白:] />代码>字符类。这或多或少与发布的USER 2196728相同。@ Jonne:但同时,我特别结合了OP的原始命令。现在看看。删除了我的评论。请注意,并非所有版本的
sed
都支持
\s
表示“空格”。考虑冗长但灵活的<代码> [[:空间:] ] <代码>或<代码> [[:空白:] ] /代码>字符类。