删除所有行中第三位的所有数字

时间:2014-10-31 21:48:51

标签: bash awk sed grep

如何从第3位删除所有号码?作为地方,我试图从第三个字符引用。换句话说:

输入

a1 bcd3 efgh3029 2993

预期输出

a1 bcd efgh

到目前为止,我已经完成了RE:s/.[0-9]//g

5 个答案:

答案 0 :(得分:1)

您可以在BASH中执行此操作:

s='a1 bcd3 efgh3029 2993'
p="${s:2}"
s="${s:0:2}${p//[0-9]/}"

echo "$s"
a1 bcd efgh

编辑您也可以使用awk针对文件执行此操作

awk -v FS= '{printf "%s%s", $1, $2; p=substr($0, 3); gsub(/[[:digit:]]+/, "", p); 
    print p}' file
a1 bcd efgh

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -r ':a;s/^(.{3}[^0-9]*)[0-9]+/\1/;ta' file

或者如果您愿意:

sed -r 's/.{3}/&\n/;h;s/[0-9]//g;G;s/.*\n(.*)\n(.*)\n.*/\2\1/' file

编辑:

第一个解决方案使用循环重复删除行中前三个字符后的数字字符。 :a是一个循环占位符,在替换命令后,ta命令会在成功时跳回到它

第二个解决方案使用“分而治之”方法,其中原始行的副本被制作并保存在保留空间(HS)中,原始行然后删除所有数字字符然后原始和副本使用原始行中的前三个字符和进程行中的其余字符将它们拼接在一起。

答案 2 :(得分:0)

这是解决问题的简单awk

awk '{for (i=3;i<=NF;i++) gsub(/[0-9]/,"",$i)}1' file

echo "a1 bcd3 efgh3029 2993" | awk '{for (i=3;i<=NF;i++) gsub(/[0-9]/,"",$i)}1'
a1 bcd3 efgh

如果要从第二个字段中删除号码,请执行以下操作:

echo "a1 bcd3 efgh3029 2993" | awk '{for (i=2;i<=NF;i++) gsub(/[0-9]/,"",$i)}1'
a1 bcd efgh

答案 3 :(得分:-1)

这是我的解决方案:

paste -d "" <(cut -c 1-2 input.txt) <(cut -c 3- input.txt | sed 's/[0-9]//g')

答案 4 :(得分:-2)

echo 'a1 bcd3 efgh3029 2993' |sed -r 's/[0-9]+//g'

你需要-r(regexp-extended)选项