#sed #command-line #text-processing
#sed #командная строка #обработка текста
Вопрос:
У меня есть текстовый файл вида:
a = 1
#b = [2,3]
c = 4
d = [5,6]
e = [7,8]
Я хочу заменить шаблон внутри скобок (и скобок) на число, но игнорировать совпадения в комментариях, предпочтительно с использованием sed .
Для файлов с ровно одной совпадающей строкой я использовал
sed -i "/^#/!s/[.*]/9/" myfile
Как это можно изменить, чтобы заменить только первое совпадение, если их больше?
Ответ №1:
Это правильно, потому что изменяется только первое вхождение.
awk '!end amp;amp; /^[^#] = [/ {$3="9"; end=1}1' myfile
- если нет конечного флага и строка не начинается с
#
и не соответствует= [
, затем измените третий столбец и установите флаг, чтобы предотвратить изменение в следующих вхождениях.
a = 1
#b = [2,3]
c = 4
d = 9
e = [7,8]
<— это не изменено так, как вы хотите
Комментарии:
1. значение «e» не обрабатывается из выборочных данных.
2. и это не должно, не так ли? Как говорит автор, как это можно изменить, чтобы заменить только первое совпадение, если их больше? ??
3. Спасибо! Это выполняется в точности в соответствии с тем, что я задал в вопросе. Однако это не сработает, если слева от ‘=’ находится более одного символа. Есть идеи для этого?
4. конечно, я это сделал — добавил
в регулярное
[^#]
выражение, оно должно работать, проверьте это, пожалуйста.
Ответ №2:
Эта однострочная строка должна выполнить эту работу:
sed '/^s*#/!{s/[[^]]*]/9/}' file
добавьте -i
опцию, если хотите внести изменения на месте.