用于从文件中删除数字的Sed脚本

时间:2017-01-19 05:25:39

标签: regex sed

我按以下格式提供数据:

comp.os.linux announce 0000002587 02190 m

comp.arch 00000 28874 y

utsa.cs.3423 00000000004 000000000001 y

我应该处理它,看起来像:

comp.os.linux announce m

comp.arch y

utsa.cs.3423 y

我已经尝试了s/^[0-9]//g它似乎运作良好,但最后一行缺少4个数字

2 个答案:

答案 0 :(得分:1)

使用awk,打印第一个和最后一个字段,如果它仅由字母字符组成,则包括第二个字段:

awk '$2~/^[[:alpha:]]+$/ {print $1, $2, $NF; next} {print $1, $NF}' file.txt

如果您坚持使用sed

sed -E 's/^([^[:blank:]]+)[[:blank:]]+([[:alpha:]]+)?.*[[:blank:]]([^[:blank:]]+)$/\1 \2 \3/'

对于不具有字母第二个字段的行,这两个字段之间将有两个空格,您可以为此添加另一个sed

sed -E 's/^([^[:blank:]]+)[[:blank:]]+([[:alpha:]]+)?.*[[:blank:]]([^[:blank:]]+)$/\1 \2 \3/; s/  / /'

示例:

% cat file.txt                                              
comp.os.linux announce 0000002587 02190 m
comp.arch 00000 28874 y
utsa.cs.3423 00000000004 000000000001 y

% awk '$2~/^[[:alpha:]]+$/ {print $1, $2, $NF; next} {print $1, $NF}' file.txt
comp.os.linux announce m
comp.arch y
utsa.cs.3423 y

% sed -E 's/^([^[:blank:]]+)[[:blank:]]+([[:alpha:]]+)?.*[[:blank:]]([^[:blank:]]+)$/\1 \2 \3/' file.txt
comp.os.linux announce m
comp.arch  y
utsa.cs.3423  y

% sed -E 's/^([^[:blank:]]+)[[:blank:]]+([[:alpha:]]+)?.*[[:blank:]]([^[:blank:]]+)$/\1 \2 \3/; s/  / /' file.txt
comp.os.linux announce m
comp.arch y
utsa.cs.3423 y

答案 1 :(得分:1)

使用sed:

sed 's/ [0-9 ]\+[0-9]\+//' file

输出:

comp.os.linux announce m
comp.arch y
utsa.cs.3423 y