Вопрос или проблема
Я хочу найти строку в файле:
пример
https://google.com/first/second/45683
и я хотел бы переписать ее и сохранить исходную строку, как здесь:
https://google.com/first/second/45683 https://yahoo.com/third/fourth/45683
Я сделал несколько попыток
sed -r 's@https://google.com/first/second/([a-Z0-9]+)@yahoo.com/third/fourth/\1@' file.txt вывод: yahoo.com/third/fourth/45683
это переписывает, но не сохраняет исходную строку
еще одна попытка
sed -r 'a\s@https://google.com/first/second/([a-Z0-9]+)@yahoo.com/third/fourth/\1@' file.txt вывод: https://google.com/first/second/45683 https://google.com/first/second/([a-Z0-9]+)@yahoo.com/third/fourth/1@
это добавляет обе строки, но не переписывает вторую строку, заранее спасибо.
Вам нужно сказать sed
, чтобы он сначала вывел соответствующую строку, прежде чем вы измените ее с помощью команды s//
. Что-то вроде этого:
sed -r '
\@https://google.com/first/second/[a-Z0-9]+@ {
p
s@https://google.com/first/second/([a-Z0-9]+)@https://yahoo.com/third/fourth/\1@
}
' < data.txt
Это говорит: “для строк, соответствующих выражению https://google.com/first/second/[a-Z0-9]+
, сначала выведите строку, а затем измените ее с помощью данного выражения s//
“. Измененная строка выводится, потому что это поведение по умолчанию для sed
.
Сделайте это просто:
$ sed -r 's@https://google.com/first/second/([a-Z0-9]+)@&\nyahoo.com/third/fourth/\1@' file
https://google.com/first/second/45683
yahoo.com/third/fourth/45683
Знак &
– это вся левая соответствующая часть.
Ответ или решение
Для того чтобы добавить новую строку после строки, содержащей заданную подстроку в файле с использованием утилиты sed
, необходимо правильно сформулировать команду. В вашем случае вы хотите найти URL https://google.com/first/second/45683
и дополнить файл строкой https://yahoo.com/third/fourth/45683
, при этом оставив оригинальную строку нетронутой.
Давайте рассмотрим последовательный подход к решению этой задачи:
Пошаговое решение
-
Поиск строки: Используем регулярное выражение для поиска строки, которая соответствует заданному URL.
-
Вывод найденной строки: Нам необходимо сохранить оригинальную строку, которая будет выведена на экран.
-
Добавление новой строки: После нахождения строки мы будем использовать специальный символ для вставки новой строки непосредственно после найденной.
Команда sed
Вот пример команды, которая решает поставленную задачу:
sed -r 's@(https://google\.com/first/second/[a-zA-Z0-9]+)@\1\nhttps://yahoo.com/third/fourth/\1@' файл.txt
Объяснение команды
-r
: Включает расширенные регулярные выражения, что упрощает синтаксис.s@...@...@
: Стандартная командаsed
для замены. Мы используем@
в качестве разделителя, чтобы избежать путаницы с символами/
в URL.(https://google\.com/first/second/[a-zA-Z0-9]+)
: Группа для захвата оригинальной строки. Обратите внимание на экранирование точки\.
.\1
: Это обращение к группе, которая была захвачена в предыдущем выражении. Оно будет использоваться для вставки оригинальной строки.\n
: Спецсимвол для переноса строки.
Пример использования
Применив вышеупомянутую команду в терминале, вы получите следующий результат:
https://google.com/first/second/45683
https://yahoo.com/third/fourth/45683
Заключение
Таким образом, команда sed
, предложенная выше, позволяет вам легко модифицировать файл, сохранив оригинальные строки и добавив дополнительные. Если у вас возникнут дополнительные вопросы или потребуется помощь по другим командам sed
, не стесняйтесь задавать их.