6行のテキストがあるとします。
Series
Of
Word
73914
Again
Word
[〜#〜] only [〜#〜]数値を含む行の先頭に文字列を追加する必要があります。挿入number-
Series
Of
Word
number-73914
Again
Word
現在、私は2つのコマンドを実行して、目的の結果を達成しています。より効率的な方法があるのだろうか。
注:1000行以上あるため、これはすべての行に適用されることが望ましいです(すでに述べました)。
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
Awkを使用する1つの方法:
awk '/^[0-9]+$/{$0="number-"$0;}1' file
数字のみを含む行
numbersを意味するのか、0-9を意味するのかは不明です。以下は、無限、非数のさまざまな表現を無視しながら、123、3.14、1e-12などを選択するPerlワンライナーです。
$ 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
「number--1」が少しゴミに見えるからといって、プレフィックスを「N:」に変更しました。これは、たとえば「1」を数値として扱わないことに注意してください。それが望ましくない動作である場合は、先頭の空白の「m/^\s /」テストを含めないでください。
「0-9」を意味する場合、上記のSergiyのsedソリューションは問題ありません。
あなたはこれを試すことができます
$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