Как предварительно ожидать строку только к строкам текста, которые являются числами

Предположим, что у меня есть 6 строк текста.

Series
Of
Word
73914
Again
Word

Я должен предварительно ожидать строку к началу строк, которые содержат ТОЛЬКО числа. Скажите, что я вставляю number-

Series
Of
Word
number-73914
Again
Word

В настоящее время я выполняю две команды для достижения желаемого результата. Интересно, существует ли более эффективный способ.

Примечание: Существуют 1000 + строки, таким образом, предпочтительно это относится ко всем строкам (я уже заявляю это).

4
задан 29 March 2019 в 02:21

4 ответа

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
ответ дан 23 November 2019 в 11:35

Один способ использовать awk:

awk '/^[0-9]+$/{$0="number-"$0;}1'  file
4
ответ дан 23 November 2019 в 11:35

строки, которые содержат ТОЛЬКО числа

Неясно, имеете ли Вы в виду числа или всего 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": просто, потому что "число - 1" взгляд немного мусора. Обратите внимание, что это рассматривает "1", например, как не числовой. Если это - нежелательное поведение, не включайте "m/^\\s /" тест для ведущего пробела.

Если Вы имеете в виду "0-9", sed решение Sergiy выше прекрасно.

3
ответ дан 23 November 2019 в 11:35

Можно попробовать это

$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
ответ дан 23 November 2019 в 11:35

Другие вопросы по тегам:

Похожие вопросы: