Shell 删除一行中除第一位以外的所有数字
晚上好, 我有文本文件,我想只保留每行的第一个数字,或者换句话说:删除除第一个数字以外的所有数字。为了方便起见,我有这个文件Shell 删除一行中除第一位以外的所有数字,shell,Shell,晚上好, 我有文本文件,我想只保留每行的第一个数字,或者换句话说:删除除第一个数字以外的所有数字。为了方便起见,我有这个文件 $ cat file one1 2two3 45end6 我期望这一结果: one1 2two 4end 有人能给我指出正确的方向吗。我认为这完全是错误的方向,但你可以这样做: sed -E -e 'h; s/([0-9]).*/\1/g; x; s/[^0-9]*[0-9]//; s/[0-9]*//g; H; g; s/\n//;' input 我认为这是完全错
$ cat file
one1
2two3
45end6
我期望这一结果:
one1
2two
4end
有人能给我指出正确的方向吗。我认为这完全是错误的方向,但你可以这样做:
sed -E -e 'h; s/([0-9]).*/\1/g; x; s/[^0-9]*[0-9]//; s/[0-9]*//g; H; g; s/\n//;' input
我认为这是完全错误的方向,但你可以这样做:
sed -E -e 'h; s/([0-9]).*/\1/g; x; s/[^0-9]*[0-9]//; s/[0-9]*//g; H; g; s/\n//;' input
我认为您的文件中没有
\r
(或者先删除该字符),因此您可以使用该字符标记数字
sed -r 's/([0-9])/\r\1/g; s/\r//; s/\r[0-9]//' inputfile
首先标记所有数字,然后删除第一个数字之前的标记,最后删除所有仍有标记的数字
编辑:替换
s/\r([0-9])/\1/代码>与s/\r/
我认为您的文件中没有\r
(或者先删除该字符),因此您可以使用该字符标记数字
sed -r 's/([0-9])/\r\1/g; s/\r//; s/\r[0-9]//' inputfile
首先标记所有数字,然后删除第一个数字之前的标记,最后删除所有仍有标记的数字
编辑:替换s/\r([0-9])/\1/代码>与s/\r/
最简单的方法是告诉sed
删除第二个数字。分几次这样做,你就可以保证除第一次出现的数字外,所有的数字都会被删除
sed -i ':a;s/[0-9]//2;ta' file
:a
定义一个标记为a
的函数
s/[0-9]//2
删除第二个数字
ta
分支到功能:
标记为a
样本输出:
one1
2two
4end
最简单的方法是告诉sed删除第二个数字。分几次这样做,你就可以保证除第一次出现的数字外,所有的数字都会被删除
sed -i ':a;s/[0-9]//2;ta' file
:a
定义一个标记为a
的函数
s/[0-9]//2
删除第二个数字
ta
分支到功能:
标记为a
样本输出:
one1
2two
4end
实际上,您可以在POSIX shell中使用expr
,也可以做您需要的事情,例如
while read -r line; do
len=$(expr match "$line" [0-9][0-9]*[A-Za-z]*)
[ "$len" -gt '0' ] && expr substr "$line" 1 $len ||
printf "%s\n" "$line"
done < file
注意:虽然这是一个使用expr match
和expr substr
的解决方案,但是sed
解决方案更有效,因为您将在每个expr
调用上生成一个单独的子shell。(但知道备选方案很好…您可以在POSIX shell中实际使用expr
,也可以做您需要的事情,例如
while read -r line; do
len=$(expr match "$line" [0-9][0-9]*[A-Za-z]*)
[ "$len" -gt '0' ] && expr substr "$line" 1 $len ||
printf "%s\n" "$line"
done < file
注意:虽然这是一个使用expr match
和expr substr
的解决方案,但是sed
解决方案更有效,因为您将在每个expr
调用上生成一个单独的子shell。(但知道替代方案很好…我还没有测试过,所以这不是答案,但不仅仅是sed-r/([0-9].][0-9]/\1/g'
work?@DanielH,它适用于此输入,但在1foo2bar3baz
这样的行上失败,其中保留了2
。但这确实指向了一个很好的perl解决方案:perl-pe'1,而s/([0-9].[0-9]/\1/g'
@DanielH和William Pursell,一个简单的循环sed
内部的sed
将对示例输入和1foo2bar3baz
起作用,就像sed-i':a;s/[0-9]//2;TA的文件< /代码> @ DanielH问题是<>代码> g>代码>标志不考虑重叠匹配,但是循环确实如此。这里有一些很好的信息,我还没有测试过,所以这不是一个答案,但不仅仅是sed-r/([0-9].][0-9]/\1/g'
work?@DanielH对这个输入有效,但在1foo2bar3baz
这样的行中失败,其中保留了2
。但这确实指向了一个很好的perl解决方案:perl-pe'1而s/([0-9].[0-9]/\1/g'
@DanielH和William Pursell,一个简单的循环sed
内部的将对示例输入和1foo2bar3baz
类似sed-i':a;s/[0-9](2)TA的文件< /代码> @ DanielH,问题是<代码> G 标志不会考虑重叠匹配,但是循环是这样的。这里有一些很好的信息,谢谢你。这是最新的方法,所以我把这张绿色的标了一下。干杯!谢谢你。这是最新的方法,所以我把这张绿色的划了。干杯!