У меня есть текстовый файл, который имеет определенную строку что-то вроде
sometext sometext sometext TEXT_TO_BE_REPLACED sometext sometext sometext
Мне нужно заменить всю строку выше
This line is removed by the admin.
Ключевое слово поиска TEXT_TO_BE_REPLACED
Мне нужно написать сценарий оболочки для этого. Как я могу добиться этого с помощью sed
?
Ответы:
Вы можете использовать команду изменения, чтобы заменить всю строку, и
-i
флаг, чтобы сделать изменения на месте. Например, используя GNU sed:источник
c\
когда непосредственно следует переменная:…c\$VAR…
обратная косая черта будет избегать доллара. В этом случае мне (bash / sed на Ubuntu 15.10) пришлось написать…c\\$VAR…
sed -i '' '/TEXT_TO_BE_REPLACED/c\This line is removed by the admin.' /tmp/foo
:; (когда первый параметр пуст, он редактирует в файле, в противном случае создает резервную копию)Вам нужно использовать wildards (
.*
) до и после, чтобы заменить всю строку:источник
sed -i -e "s/.*search_string.*/Replacement_line/' file_being_searched.txt
-i
опциюПринятый ответ не сработал для меня по нескольким причинам:
-i
с расширением нулевой длиныc\
команды странный, и я не мог заставить его работатьИтак, вот решение, которое я придумала, которое, я думаю, должно работать в большинстве случаев:
Итак, пример использования для устранения проблемы:
источник
Ответ выше:
Работает нормально, если строка / строка замены не является переменной.
Проблема в том, что на Redhat 5
\
послеc
побега$
. Дабл\\
тоже не сработал (по крайней мере на Redhat 5).Посредством попадания и пробного использования я обнаружил, что
\
послеc
является избыточным, если ваша строка / строка замены - только одна строка. Поэтому я не использовал\
послеc
, использовал переменную в качестве одной строки замены, и это было радостью.Код будет выглядеть примерно так:
Обратите внимание на использование двойных кавычек вместо одинарных.
источник
Все ответы, представленные до сих пор, предполагают, что вы знаете что-то о тексте, который нужно заменить, что имеет смысл, поскольку именно об этом спрашивал ОП. Я даю ответ, который предполагает, что вы ничего не знаете о тексте, подлежащем замене, и что в файле может быть отдельная строка с тем же или похожим содержанием, которое вы не хотите заменять. Кроме того, я предполагаю, что вы знаете номер строки, подлежащей замене.
Следующие примеры демонстрируют удаление или изменение текста по определенным номерам строк:
источник
для манипулирования конфигурационными файлами
я придумал это решение, вдохновленное ответом skensell
configLine [searchPattern] [replaceLine] [filePath]
Так и будет:
Функция:
сумасшедшая магия состояния выхода происходит с https://stackoverflow.com/a/12145797/1262663
источник
работает нормально
источник
В моем make-файле я использую это:
PS: НЕ забывайте, что -i на самом деле изменяет текст в файле ... поэтому, если шаблон, который вы определили как «Редакция», изменится, вы также измените шаблон для замены.
Пример вывода:
Таким образом, если вы установите шаблон «Revision: 1190», он, очевидно, будет отличаться от того, что вы определили как «Revision:» только ...
источник
Файл find_replace содержит 2 столбца, c1 с шаблоном для сопоставления, c2 с заменой, цикл sed заменяет каждую строку, содержащую один из шаблона переменной 1
источник
sed
один раз с файлом сценария, содержащим все замены, которые вы хотите выполнить. Запускsed -i
на тот же файл несколько раз это ужасны антипаттерны.Это похоже на вышеупомянутый ..
источник
FOO=TEXT_TO_BE_REPLACED
наFOO=This line ...
так, не соответствует спецификации.Ниже команда работает для меня. Который работает с переменными
источник
Я очень часто использую регулярное выражение для извлечения данных из файлов , я использовал только что заменить буквальную цитату
\"
с//
ничего :-)источник