как заменить повторяющуюся строку переменной длины другой строкой в ​​bash? - PullRequest
2 голосов
/ 05 мая 2020

У меня есть файлы, в которых отсутствующие данные вставлены как «+». Итак, строки выглядят так:

substring1+++++substring2++++++++++++++substring3+substring4

Я хочу заменить все повторения '+'> 5 на 'MISSING'. Это делает его более читабельным для моей команды и позволяет легче увидеть разницу между отсутствующими данными и данными, введенными как «+» (допускается до 5). Пока у меня есть:

while read l; do
  echo "${l//['([+])\1{5}']/'MISSING'}"
done < /path/file.txt

, но это заменяет каждый «+» на «MISSING». Мне нужно, чтобы он сказал "MISSING" только один раз.

Заранее спасибо.

1 Ответ

4 голосов
/ 05 мая 2020

Вы не можете использовать регулярное выражение в Bash расширении переменной.

В вашем l oop вы можете использовать

sed 's/+\{1,\}/MISSING/g' <<< "$l"

Или вы можете использовать sed непосредственно в файле

sed 's/+\{1,\}/MISSING/g' /path/file.txt

+\{1,\} Шаблон POSIX BRE соответствует литералу + (+) 1 или более раз (\{1,\}).

См. sed демонстрацию в Интернете

sed 's/+\{1,\}/MISSING/g' <<< "substring1+++++substring2++++++++++++++substring3+substring4"
# => substring1MISSINGsubstring2MISSINGsubstring3MISSINGsubstring4

Если вам нужно внести изменения в тот же файл, используйте любую технику, описанную в sed редактировать файл на месте .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...