Shell Sed命令替换空格和之间的数字:

Shell Sed命令替换空格和之间的数字:,shell,unix,awk,sed,Shell,Unix,Awk,Sed,我有一个记录如下的文件 FIRST 1: SECOND 2: THREE 4: FIVE 255: SIX 255 我要删除空格和之间的值: FIRST:SECOND:THREE:FIVE:SIX 带代码 awk -F '[[:space:]]*,:*' '{$1=$1}1' OFS=, file 您还可以添加带有结尾星号的[[:digit:],并在OFS=后面只留下一个空格: $ awk -F '[[:space:]][[:digit:]]*' '{$1=$1}1' OFS= file

我有一个记录如下的文件

FIRST 1: SECOND 2: THREE 4: FIVE 255: SIX 255
我要删除空格和之间的值:

FIRST:SECOND:THREE:FIVE:SIX
带代码

awk -F '[[:space:]]*,:*' '{$1=$1}1' OFS=, file

您还可以添加带有结尾星号的
[[:digit:]
,并在
OFS=
后面只留下一个空格:

$ awk -F '[[:space:]][[:digit:]]*' '{$1=$1}1' OFS= file
FIRST:SECOND:THREE:FIVE:SIX
在gnu awk上试用:

awk -F' [0-9]*(: *|$)' -vOFS=':' '{print $1,$2,$3,$4,$5}' file
在gnu上试用:

sed -E 's/\s+[0-9]+(:|$)\s*/\1/g' file
awk的解释,

regex
,一个空格,后跟
[0-9]+
一个或多个数字,后跟文字
后跟一个或多个空格:
*
,如果所有这些匹配,则收集除此匹配模式之外的所有内容,即第一、第二,。。。如此类推,因为
-F
选项将其确定为字段分隔符(FS)和$1、$2。。因此,除FS外,on始终是其他选项。但是输出需要漂亮的外观,也就是说,有FS,所以它应该是
,它应该是awk变量定义-vOFS=”:“

为了得到我们想要的输出,在惯用awk中,我们让输入字段分隔符(带有
-F
)包含我们想要消除的所有东西(以
锚定:
),并使输出字段分隔符(
OFS
)成为我们想要替换的内容。问题是,这不会消除行末尾的空格和数字,为此,我们需要做更多的工作。GNU实现的awk将允许我们使用正则表达式作为输入记录分隔符(
RS
),但我们也可以对POSIXawk执行一个简单的
sub()
。最后,通过
$1=$1
强制重新计算。。。此模式/语句的副作用是,缓冲区将在执行FS/RS替换时重新计算,非空行将执行默认操作,即打印

gawk -F '[[:space:]]*[[:digit:]]*:[[:space:]]*' -v OFS=: -v RS='[[:space:]]*[[:digit:]]*\n' '$1=$1' file
或:

sed的sed实现很有趣,但可能较慢(因为当前版本的awk具有更好的regex实现)

或者如果POSIX字符类不可用

sed 's/[\t ]*[0-9]*:[\t ]/:/g; s/[\t ]*[0-9]*[\t ]*$//' file

有些东西告诉我你的“第一、第二、第三…”可能更复杂,可能包含数字。。。在这种情况下,您可能需要尝试将
*
替换为awk
+
,或者将
\+
替换为sed
tr-d'0-9'
字段分隔符是正则表达式,而不是范围表达式,因此
-F'[[:space:]*],:*“
表示您的输入将被拆分为多个字段,每个字段由
字符串分隔,该字符串由零个或多个空格组成,后跟逗号,后跟零个或多个冒号
。您可以在字段中的任何其他位置使用数字、空格或冒号(例如作为字段的一部分,如
SECOND
)?字段也可能有这样的数字:FIRST_1 1:SECOND_2 2:THREE_33 4:FIVE_2 255:SIX 255Triedn,但在这个x='FIRST 1:SECOND 2:THREE 4:FIVE 255:SIX 255'echo$x | awk-F'[:space:][:digit:][]*'{$1=$1}1'OFS=前1:2:3 4:5 255:6255@senthilnathan您有一个名为
file
的文件,内容为
第一个1:SECOND 2:THREE 4:FIVE 255:SIX 255,是吗?senthil@ubuntu:~$cat文件第一个1:第二个2:3 4:5 255:6 255senthil@ubuntu:~$awk-F'[[:space:][[:digit:][]*''{$1=$1}1'OFS=file FIRST 1:SECOND 2:THREE 4:FIVE 255:SIX 255感谢Awk选项起作用。你能解释一下(:*|$)是什么吗?
sed 's/[[:space:]]*[[:digit:]]*:[[:space:]]/:/g; s/[[:space:]]*[[:digit:]]*[[:space:]]*$//' file
sed 's/[\t ]*[0-9]*:[\t ]/:/g; s/[\t ]*[0-9]*[\t ]*$//' file