объединить 2 sed без сохранения изменений в файле

объединить 2 sed без сохранения изменений в файле

Возможно ли вообще удалить специальные символы, такие как \, из файла при чтении и поиске в файле word с помощью sed и закомментировать строку, содержащую word, а затем сохранить, но \ останется на месте?

Я имею в виду, что у меня есть файл с названиями компаний (2 слова) и между ними могут быть некоторые символы, и в исходном файле использовалось экранирование символов (регулярное выражение) для этих символов. Например

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\_M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\.M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

Я заменяю \ ничем и комментирую, но я хочу сохранить с \ тоже, как было раньше. Вывод, который я хотел бы иметь:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

Мой сценарий:

sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt

Но он сохраняет без \. Да, я знаю, что могу не удалять и просто искать как Red\\\\ Park. Однако, если у меня 20 имен, я бы не хотел вводить \\\\ для каждого названия компании, состоящего из 2-3 слов:) Или, может быть, у вас есть другое видение, как это сделать с помощью другой команды, а не sed? Я открыт для любого совета или помощи. Возможно ли получить то, что я хочу? Большое спасибо!

решение1

Если я правильно вас понял, давайте посмотрим, подойдет ли вам это:

sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file

Выход:

lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"

решение2

Говорят, что настойчивость — это добродетель...

Я предполагаю, что все 2 названия компаний разделены \\еще одним символом, и что названия стран всегда заглавные, а все названия компаний содержат по крайней мере одну строчную букву, т. е. компания не может быть подстрокой названия страны.

Решение awk, если ваше решение поддерживает эту -i inplaceопцию; я думаю, что большинство поддерживает

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
    OFS="\\"}
    $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}
    NF>1{$NF=" "substr($NF,2)
    };1' file1
Output

#lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"

Прохождение

Скажите awk, чтобы внести изменения -i inplaceи передать вашу страну и компанию в качестве переменных -v. Поскольку у вас есть неизвестный разделитель после \\в вашем файле, то используйте .между двумя частями названия компании

awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{

установите разделитель полей на break, \что даст вам 3 поля, где \\встречается, а затем установите

        OFS="\\"} 

чтобы вернуть их на место при печати, если произошел перерыв.

Если первое поле $1==country— это первая часть совпадения.

Для компании проверьте, разделили ли вы данные \и не осталось ли в итоге нескольких полей NR>1, а затем проверьте либо последние 2 поля, либо неразделенное поле, в зависимости от ситуации.

Если у нас есть совпадение, то printf #(это печать без новой строки)

        $1~country && NR>1?$(NR-2)$NR:$1~company{
        printf "#"}

Если у вас больше одного поля, NF>1то вы разделяете его по \\?названию компании и хотите убедиться, что ?при печати есть пробел, поэтому удалите первый символ последнего поля и замените его пробелом.

    NF>1{$NF=" "substr($NF,2)

И распечатать

;1' file1

Связанный контент