Я пытаюсь выяснить, как заменить шаблон определенное количество раз, используя 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 или что-то еще
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','
опция.