У меня есть два файла; первый включает шаблоны (file.txt), которые я хочу найти во втором файле (file.cfg).
После того, как шаблон найден в "file.cfg", я хочу удалить его + все, что идет после него, до следующего приветствия, которое идет в начале строки.
Я создал приведенный ниже скрипт, но он не работает:
#! /bin/bash
cat file.txt | while read LINE; do
echo $LINE
sed -i "/^$LINE$/,/^Hello/{//p;d;}" "file.cfg"
sed -i "/^$LINE$/d" "file.cfg"
done
Вчера он работал нормально с тестовыми файлами. Сегодня я изменил имя файла, и он перестал работать.
Я не уверен. Если я что-то изменил по ошибке, но если я воспользуюсь приведенной ниже командной строкой Ubuntu, это сработает:
sed -i "/^Hello World$/,/^Hello/{//p;d;}" "file.cfg"
Кроме того, я добавил эхо в цикл, и я могу видеть каждую строку в "file.txt"
Чтобы предоставить дополнительную информацию, я приведу пример того, чего мне нужно достичь с помощью этого кода:
"file.txt" содержит шаблоны. Мне нужно найти совпадение в "file.cfg", как только шаблон будет найден, мне нужно удалить его, и все, что следует после него, до следующего Hello.
sed -i "/^$LINE$/,/^Hello/{//p;d;}" "file.cfg"
-- > эта строка должна удалить все промежуточные значения.
sed -i "/^$LINE$/d" "file.cfg"
--- > удалить сам шаблон.
++++++++++
См. пример ниже:
Файл.cfg разбит на секции; каждый раздел начинается с Hello
Файл.txt содержит случайные имена разделов; Мне нужен скрипт, чтобы прочитать имя раздела из File.txt и посмотреть, доступен ли он в file.cfg, а затем удалить имя раздела и все его содержимое
Файл.txt :
Hello World
Hello Mohammad
Hello Scripting
Файл.cfg :
Hellow xyz
a
b
c
Hello World
v
b
n
Hello stack
q
w
e
Окончательные результаты должны быть:
Hellow xyz
a
b
c
Hello stack
q
w
e
После того, как имя раздела найдено, мне нужно удалить все до следующего приветствия, которое появляется в начале строки (новый раздел).
Ни одна из строк не начинается с Hello, кроме имени раздела.
Многократная перезапись одного и того же файла с
sed -i
в цикле неэффективна и подвержена ошибкам. Вероятно, попробуйте провести рефакторинг, чтобы создать один скриптsed
из входного файла. И попробуйте shellcheck.net, чтобы вам указали на некоторые другие распространенные ошибки в вашем коде.Пожалуйста, прочитайте почему-это-использование-цикла-оболочки-для-обработки-текста-считается-плохой-практикой, чтобы понять некоторые проблемы с вашим сценарием, это-возможно- to-escape-regex-metacharacters-reliably-with-sed для других и скопируйте/вставьте его в shellcheck.net для получения дополнительной информации. отредактируйте свой вопрос, включив в него краткий, проверяемый образец входных данных и ожидаемый результат, чтобы мы могли вам помочь.
И не используйте слово «шаблон» при указании требований для сопоставления текста, поскольку это очень двусмысленно, вместо этого используйте регулярное выражение или строку плюс полное или частичное. См. раздел как найти текст, соответствующий шаблону.
Спасибо за документы. Не могли бы вы помочь мне исправить мой код? Я все еще новичок в написании сценариев, и я должен заставить его работать сегодня.
Мы определенно можем помочь вам исправить ваш код, но нам нужно, чтобы вы сказали нам, что он должен делать, и сначала привели пример. В настоящее время мы даже не знаем, следует ли рассматривать
$LINE
как регулярное выражение или как строку (например, должно лиa.c
в LINE соответствоватьabc
в файле .cfg или нет?). Пожалуйста, отредактируйте свой вопрос, чтобы, как минимум, заменить «шаблон» регулярным выражением или строкой и добавить образец ввода и ожидаемый вывод, который демонстрирует, что вам нужно от сценария, и мы можем скопировать / вставить для тестирования.@triplee сделал предположение о том, что вы можете захотеть, и мне это показалось разумным предположением, но, видимо, это не то, что вы хотите, и вы не сказали, каким образом это не удалось, поэтому нет смысла кому-либо еще строить предположения, когда вы мог бы просто рассказать и показать нам.
Заранее спасибо, я добавил больше деталей, пожалуйста, дайте мне знать, если теперь все ясно
Кажется, теперь все ясно, поэтому я добавил решение.
Что вы имеете в виду, когда говорите, что это «не работает»? Это вообще меняет текст? Выдает сообщение об ошибке? Что произойдет, если удалить
-i
? Если вы поместитеecho
перед командами sed в скрипте, что вы увидите?