Sed добавить слово в конце строки с \ n

У меня есть файл с такой структурой:

word1 word2 word3
word4 word5 word6

и я использую команду

sed -i '1s/$/word7/' file

добавить слово "word7" в конец первой строки

Проблема в том, что слово не добавляется в конец первой строки, а добавляется так:

word1 word2 word3
word7
word4 word5 word6

НО, когда я запускаю команду wc -l file, количество строк в моем файле не изменилось (по-прежнему 2)!

Я думаю, может быть, проблема в том, как файл был создан, он был создан программой на C с таким синтаксисом:

fprintf(file, "word1 word2 word3 \n");

Я не могу повторно запустить свою программу на C, поэтому какую команду bash мне следует запустить, чтобы получить:

word1 word2 word3 word7
word4 word5 word6

?


person Sulli    schedule 14.01.2013    source источник
comment
ИМХО вы пропускаете пробел перед словом 7. Остальное у меня работает как положено. Пожалуйста, попробуйте hexdump или od -xa на результат.   -  person Andreas Florath    schedule 14.01.2013
comment
Я пробовал с пробелом, но он все равно не работает. Как точно использовать hexdex? Другой забавный факт: если я открываю свой файл вручную, изменяю его и сохраняю, команда 'wc -l file' дает мне 0 строк!   -  person Sulli    schedule 14.01.2013
comment
@Sullivan Orlean: для шестнадцатеричного дампа используйте hd -c file   -  person Lorenzo L    schedule 14.01.2013
comment
вы также можете сделать: cat -v file, что часто бывает достаточно, чтобы увидеть специальные символы (но иногда может быть недостаточно). Проблема, вероятно, возникает при создании файла: \ n компилятора C сервера может отличаться от \ n на машине, на которой вы используете sed. Попробуйте установить LC_LANG значения каждого сервера.   -  person Olivier Dulac    schedule 14.01.2013
comment
Я не знаю, кто удалил ответ ниже, где была вся информация для решения! Моя проблема заключалась в том, что в моем файле были символы конечной строки Windows, которые я мог видеть с помощью команды 'file myFile'. Все, что мне нужно было сделать, это команда dos2unix myFile, чтобы sed работал правильно.   -  person Sulli    schedule 14.01.2013


Ответы (1)


Проблема в том, что соглашение о конце строки во входном файле и то, что ожидает sed, отличаются. Ваш входной файл использует соглашение DOS о конце строки, где конец строки помечен 2-байтовой последовательностью 0x0d 0x0a. В отличие от этого, sed ожидает однобайтовое соглашение UNIX 0x0a. Раньше 0x0d фактически означало «возврат каретки», а 0x0a означало «перейти на одну строку вниз».

Поэтому, когда вы запускаете sed, он заменяет только один байт 0x0a, оставляя непечатаемый возврат каретки 0x0d.

Я бы рекомендовал удалить все байты возврата каретки, выполнив

tr -d '\r' < file_DOS > file_UNIX

а затем действуйте как раньше. Обратите внимание: если ваши слова содержат непечатаемые символы, это может испортить ваши данные.

person user1978011    schedule 14.01.2013