Это может произойти, если ваш исходный файл (или менее вероятно, что ваша команда 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.