web-dev-qa-db-ja.com

数値であるテキスト行のみに文字列を追加する方法

6行のテキストがあるとします。

Series
Of
Word
73914
Again
Word

[〜#〜] only [〜#〜]数値を含む行の先頭に文字列を追加する必要があります。挿入number-

Series
Of
Word
number-73914
Again
Word

現在、私は2つのコマンドを実行して、目的の結果を達成しています。より効率的な方法があるのだろうか。

注:1000行以上あるため、これはすべての行に適用されることが望ましいです(すでに述べました)。

4
Liso

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
9

Awkを使用する1つの方法:

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

数字のみを含む行

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ソリューションは問題ありません。

3
Chris Williams

あなたはこれを試すことができます

$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
2
Goron