Найти строку и добавить текст в конце не работает - PullRequest
0 голосов
/ 13 июня 2019

Мне нравится добавлять дополнительный текст в конец строки поиска.

Я нашел решение здесь: Найдите строку в файле и добавьте что-нибудь в конецстрока в bash

Но когда я попытался сделать это с помощью sed или awk вместо добавления его в конец, он заменил искомую строку.

Моя команда:

sed 's/^string_for_search.*/& text_to_append/' file

Я сделал что-то не так или это правильное поведение?

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

Синтаксис, который вы ищете:

sed 's/^\(string_for_search.*\)/\1 text_to_append/' file

Пример:

$ cat ~/tmp/t
Hello
World

$ sed 's/\(Hello.*\)/\1, hello/' ~/tmp/t
Hello, hello
World
0 голосов
/ 13 июня 2019

Это может произойти, если ваш исходный файл (или менее вероятно, что ваша команда sed) содержит символ возврата каретки (ASCII 0x13, часто записываемый как \r).

Это один из двух символов, составляющих перевод строки Windows, поэтому ваш исходный файл, скорее всего, будет содержать их, если он был создан в Windows. Однако в Linux они интерпретируются буквально как сигнал к «вернуть карету» и начать переписку с начала строки.

Файл со следующим содержанием:

string_for_search\r\n
string_for_search\r\n
whatever\r\n

Будет преобразован вашей командой sed в

string_for_search\r text_to_append_which_i_assume_is_longer\n
string_for_search\r text_to_append_which_i_assume_is_longer\n
whatever\r\n

, который будет отображаться следующим образом:

 text_to_append_which_i_assume_is_longer
 text_to_append_which_i_assume_is_longer
whatever

Вы можете проверить, действительно ли это ваша проблема, отправив выходные данные на cat -A, который отображает специальные символы: вы должны увидеть исходную строку, за которой следует ^M, представляющий возврат каретки, сам по себе, за которым следует шаблон замены и $ представляет \n перевод строки:

string_for_search^M text_to_append_which_i_assume_is_longer$
string_for_search^M text_to_append_which_i_assume_is_longer$
whatever^M$

Если это действительно проблема, то решение состоит в том, чтобы удалить \r из исходного файла, что можно сделать с помощью утилиты dos2unix, если она доступна, или tr -d '\r'. Программное обеспечение, производящее ваши данные, может также иметь настройки, позволяющие избежать использования перевода строки в стиле Windows.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...