假设我有 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