Замените шаблон определенное количество раз на строку, используя sed

Я пытаюсь выяснить, как заменить шаблон определенное количество раз, используя sed.

Я обнаружил, что sed с флагом g заменяет все вхождения, без 1 раза, с указанным числом заменяет это вхождение, g3 больше / равно 3.

Но как заменить шаблон из какого-то раздела или меньше некоторого числа?

например Ввод, одна строка содержит номер карты, и я хочу хэшировать его часть

1234 1234 1234 1234  
1234 1234 1234 1234
1234 1234 1234 1234
1234 1234 1234 1234 

Команды:

$ sed "s/[0-9]\\{4\\}/\\*\\*\\*\\*/g"
**** **** **** ****
$ sed "s/[0-9]\\{4\\}/\\*\\*\\*\\*/g3"
1234 1234 **** ****
$ sed "s/[0-9]\\{4\\}/\\*\\*\\*\\*/2"
**** 1234 **** ****

Я ищу способ заменить на хэш-специфическое вхождение шаблона, например. 1-3 или <3. Для большего вхождения шаблона в каждой строке может быть 5-10 или что-то еще

3
задан 9 August 2017 в 08:53

1 ответ

GNU sed, Да, имеет ту опцию заменить все g occuraces башмака или от возникновения Xth до всех после этого gX, но можно использовать эти два расширения для достижения того, как что Вы хотите заменить только первый Y occuraces ниже для замены сначала 3 occuraces ШАБЛОНА.

sed -E 's/PATTERN/TEMP-REPLACE/g4; s/PATTERN/REPLACE/g; s/TEMP-REPLACE/PATYERN/g' infile.txt

Также как решение не-GNU, у Вас может быть Y sed части для замены времен Y ШАБЛОНА как ниже,

sed -E -e 's/PATTERN/REPLACE/' -e 's/PATTERN/REPLACE/' -e 's/PATTERN/REPLACE/'

Обновленный ответ как вопрос пересмотрен

Вы могли использовать awk для него с определением двух флагов управления для ЗАПУСКА и КОНЦА и действительно любят ниже:

awk -v START=1 -v END=5 '{for (i=START;i<=END;i++) gsub(/PATTERN/,"****",$i)}1' infile.txt 

обратите внимание на то, что по умолчанию awk при рассмотрении для чтения файла, разграниченного вкладкой или пространством, если Ваш отличается, или Вы хотите сказать awk, что это, например, ,, можно установить с -F',' опция.

4
ответ дан 9 August 2017 в 18:53

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

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