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 标志不会考虑重叠匹配,但是循环是这样的。这里有一些很好的信息,谢谢你。这是最新的方法,所以我把这张绿色的标了一下。干杯!谢谢你。这是最新的方法,所以我把这张绿色的划了。干杯!