如何将字符串添加到仅包含数字的文本行之前

如何将字符串添加到仅包含数字的文本行之前

假设我有 6 行文本。

Series
Of
Word
73914
Again
Word

我需要在包含以下内容的行开头添加一个字符串仅有的数字。假设我插入number-

Series
Of
Word
number-73914
Again
Word

目前我运行了两个命令才达到想要的效果,不知道有没有更高效的方法。

注意:有 1000 多行,因此最好适用于所有行(我已经说明了)。

答案1

sed可以这样做:

$ sed 's/^[[:digit:]]*$/number-&/' input.txt
Series
Of
Word
number-73914
Again
Word

如果我们想要考虑空行,我们会使用+以下-r选项:

$ sed -r 's/^[[:digit:]]+$/number-&/' input.txt
Series
Of
Word
number-73914
Again
Word
line below is empty

line above is empty

验证一切正常后,您可以使用-i选项编辑文件本身,即sed -i ...。否则,您可以随时使用以下命令复制文件 sed 's/^[[:digit:]]*$/number-&/' input.txt > output.txt

请注意,这假设文件格式一致,每行没有前导空格或尾随空格。

这里还有额外的 Python:

$ python3 -c 'import sys; print("\n".join([ "number-" + i.strip() if i.strip().isnumeric() else i.strip() for i in sys.stdin]))' < input.txt
Series
Of
Word
number-73914
Again
Word
line below is empty

line above is empty

答案2

使用 awk 的一种方法:

awk '/^[0-9]+$/{$0="number-"$0;}1'  file

答案3

仅包含数字的行

不清楚你是否意味着数字或者只是 0-9。下面是一条 Perl 单行代码,它挑选出 123、3.14 和 1e-12 之类的数字,同时忽略无穷大和非数字的各种表示:

$ perl -MScalar::Util -ne 'chomp; if (!(m/^\s/ || m/^[\+-]?inf(?:inity)?$/i || m/^nan$/i) && Scalar::Util::looks_like_number($_)) { print("N:"); } print("$_\n");' <x
a
N:123
N:+1
N:-1
 1
b

1a
N:3.14
c
3.1415926 is an approximation of pi
N:1e-12
inf
Inf
Infinity
Infinity +1 sword
+Infinity
-infinity
NaN
1/2

我将前缀改为“N:”,只是因为“number--1”看起来有点乱。请注意,这会将“1”等视为非数字。如果这是不良行为,请不要包含“m/^\s/”测试以检测前导空格。

如果您的意思是“0-9”,那么上面的 Sergiy 的 sed 解决方案就可以了。

答案4

你可以尝试一下

$cat input.txt
Series
Of
Word
73914
Again
Word

$awk '{ if($1 ~/[0-9]/) printf "number - %s\n",$1; else print $1 }' input.txt
Series
Of
Word
number - 73914
Again
Word

相关内容