Возможно ли вообще удалить специальные символы, такие как \, из файла при чтении и поиске в файле 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