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

时间:2019-04-24 18:06:40

标签: 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

3 个答案:

答案 0 :(得分:1)

您也可以在[[:digit:]]后面加上星号,并仅在OFS=之后留一个空格:

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

答案 1 :(得分:1)

在gnu awk上尝试过:

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

尝试使用gnu sed:

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

awk的解释,
正则表达式,一个空格,后跟[0-9]+一个或多个数字,然后是文字:,后跟一个或多个空格:*,如果所有这些都匹配,则收集所有内容除了这种匹配的模式,即。 FIRST,SECOND等...之所以如此,是因为-F选项将其确定为字段分隔符(FS),而$ 1,$ 2 ..等始终不是FS。但是输出需要漂亮的外观,即。具有FS,因此它将为:,并且它将是awk变量定义-vOFS =':'

答案 2 :(得分:0)

要在惯用的 awk 中获得我们想要的输出,我们使输入字段分隔符(带有-F)包含我们要消除的所有内容(带有:固定) ),然后将输出字段分隔符(OFS)替换为我们想要的内容。需要注意的是,这不会消除行尾的空格和数字,为此,我们需要做更多的事情。 GNU awk 的实现将允许我们对输入记录分隔符(RS使用正则表达式,但是我们可以对POSIX投诉做一个简单的sub()以及。最后,通过$1=$1强制重新计算...此模式/语句的副作用是缓冲区将被重新计算,为我们执行FS / RS替换,并且非空白行将采取默认操作-是要打印。

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

或者:

awk -F '[[:space:]]*[[:digit:]]*:[[:space:]]*' -v OFS=: '{ sub(/[[:space:]]*[[:digit:]]*$/, “”) } $1=$1' file

sed 的实现很有趣,但可能会更慢(因为 awk 的当前版本具有更好的正则表达式实现)。

sed 's/[[:space:]]*[[:digit:]]*:[[:space:]]/:/g; s/[[:space:]]*[[:digit:]]*[[:space:]]*$//' file

或者如果POSIX字符类不可用...

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

某事告诉我,您的“第一,第二,第三...”可能更复杂,并且可能包含数字...在这种情况下,您可能想尝试用{{1替换* }}表示 awk 或使用+表示 sed