Как вставить текст перед первой строкой файла?


76

Я искал sedкоманду для добавления текста в файл в определенной строке. Это работает, добавляя текст после строки 1:

sed '1 a\

Но я хочу добавить его перед строкой 1. Это будет:

sed '0 a\

но я получаю эту ошибку: invalid usage of line address 0.

Любое предложение?


Ответы:


102

Используйте опцию sed'insert ( i), которая вставит текст в предыдущей строке.

sed '1 i\

Обновление автора вопроса:

Чтобы заставить его редактировать файл на месте - с помощью GNU sed- мне пришлось добавить -iопцию:

sed -i '1 i\anything' file

Также синтаксис

sed  -i '1i text' filename

Для не GNU sed

Вам нужно нажать клавишу возврата сразу после обратной косой черты 1i\и после first_line_text:

sed -i '1i\
first_line_text
'

Также обратите внимание, что некоторые реализации не-GNU sed(например, в macOS) требуют аргумента для -iфлага (используйте -i ''для получения того же эффекта, что и в GNU sed).


1
Это не работает без -iопции. Я обновлю ваш ответ, прежде чем принять.
Маноло

1
Благодарю. Какую ОС вы используете? Оригинальное решение работало на OpenSuse 9.
suspectus

1
Интересно! Я на Lubuntu 13.10 и sed '1 i\this text is entered above the existing first line' fileу меня работает.

2
Здесь использование sed (GNU sed) 4.2.2просто sed '1 i text to insert' -i fileработает как шарм. Спасибо
тонна

1
@FeRD Смотрите мой плохой рейтинг awkниже. Это должно работать.
rudimeier

18

Эхо используется для получения текста. Cat filename - печатает файл в консоли и> использует его для отправки в другой файл filename1, а затем мы перемещаем filename1 в filename, чтобы получить текст, вставленный в первую строку нужного файла.

  (echo "some text" && cat filename) > filename1 && mv filename1 filename

7
Пожалуйста, дайте мне знать, почему следующее голосование понижено
Ankit Shah

1
Возможно, потому что OP упоминает sed. Это не заслуживает отрицательного голосования по моему мнению. Это решение даже лучше всего соответствовало моим потребностям, а затем проголосовало.
Рюффп

Я проголосовал. у меня работает по кш.
arcee123

17

Вы можете использовать Vim в режиме Ex:

ex -sc '1i|ALFA BRAVO' -cx file
  1. 1 выберите первую строку

  2. i вставить текст и перевод строки

  3. x сохранить и закрыть


7

Вы хотите вставить текст перед первой строкой, а не добавлять его после, поэтому используйте

sed '1 i\
your_text' your_file

Здесь также может помочь документ:

cat /dev/stdin your_file <<EOI
Your text
goes here
EOI

6

Использование GNU awk> = 4.1:

awk -i inplace 'BEGINFILE{print "first line"}{print}' foo.sh

В отличие от всех sedответов, это работает и для пустых файлов.


inplaceэто библиотека, и, к сожалению, она появляется во всех дистрибутивах awk. Я получаю "awk: fatal: не могу открыть исходный файл" на месте "для чтения"GNU Awk 4.2.1, API: 2.0 (GNU MPFR 4.0.1, GNU MP 6.1.2)
vossad01

6
sed  -i '1i new_text' file_name

Если вы не укажете эту -iопцию, она не будет отображать никаких ошибок и отображает вывод на стандартном терминале, но не вставляет текст в файл.


Вопрос не в -iвыключателе.
don_crissti

Как вы это понимаете? Это является ответом на вопрос. Да, это похоже на принятый ответ, но не совсем то же самое.
G-Man

@ G-Man - можно утверждать, что шаблон, используемый cas, далек от идеала, но на самом деле, он похож на почти идентичный ... разница в том, что интервал и тот факт, что у него нет обратной косой черты. Насколько я понимаю, они технически идентичны (так как они оба gnu sedспецифичны, и просто случается так, что gnu sedони примут iбез обратной косой черты). Если другие думают, что это требует отдельного ответа + повышенный голос ... о, хорошо.
don_crissti

2

Команда, с которой 0aвы попытались , работает ex, предшественникvi :

printf '%s\n' 0a 'Anything you want to add' . x | ex file.txt

Команда printfсама выводит:

0a
Anything you want to add
.
x

Эти 0aсредства после того, как добавить 0 - й строки (т.е. до первой строки).

Следующая строка или несколько строк - это текст, который нужно добавить.

Функция .on on сама завершает команду "append".

В xпричинах Ex , чтобы сохранить изменения в файл и выйти.


1

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

$ sed  -i '1s/^/new_text\
/' file_name

Который работает в большинстве оболочек и переносим для нескольких версий sed.
Если доступен GNU sed, вы можете использовать это:

$ sed -i '1s/^/new_text\n' file_name

Разница в том, что GNU sed позволяет использовать a \nдля новой строки, а другим нужен буквальный символ новой строки, которому предшествует обратный слеш (который в любом случае также работает в GNU sed).

Если используется оболочка, которая принимает $'…'синтаксис, вы можете вставить новую строку напрямую, поэтому sed увидит, что новая строка уже есть:

$ sed -i $'1s/^/new_text\\\n/' file_name

Который работает для более sed версий.


-1

К сожалению, все ответы выше (в основном с sed) не сработали для меня, так как они все заменили первую строку. Я на Ubuntu 16.04 LTSмашине. Вот мой обходной путь с GNU Awk 4.0.2:

awk '{if(NR==1){$0="NEW_FIRST_LINE"$0; print $0} ;if(NR!=1){print $0}}' file_name

1
Не уверен, о чем вы говорите ... Есть только один sedответ, который использует замену, но он не заменяет существующую строку.
don_crissti

-2

В общем и целом

Я бы предположил, что любой, кто искал, как вставить / добавить текст в начало / конец файла, вероятно, также должен знать, как сделать другой.

cal |                            \
  gsed -E                        \
       -e     '1i\{'             \
       -e     '1i\  "lines": ['  \
       -e 's/(.*)/    "\1",/'    \
       -e '$s/,$//'              \
       -e     '$a\  ]'           \
       -e     '$a\}'

объяснение

Это calвыводится по конвейеру в gnu- sed( вызывается gsedна macOS, установленном через brew.sh ) с расширенным RegEx ( -E) и применены 6 «скриптов» ( -e), а разрывы строк экранированы \для удобства чтения. Сценарии 1 и 2 используются 1i\для «в строке 1 вставить». Сценарии 5 и 6 используются $a\для «в строке <последний>, добавить». Я выровнял текстовые выходные данные по вертикали, чтобы код представлял то, что ожидается в результате. Сценарии 3 и 4 выполняют подстановки (последние применяются только к «line <last>»). Результатом является преобразование вывода команды в допустимый JSON.

выход

{
  "lines": [
    "    October 2019      ",
    "Su Mo Tu We Th Fr Sa  ",
    "       1  2  3  4  5  ",
    " 6  7  8  9 10 11 12  ",
    "13 14 15 16 17 18 19  ",
    "20 21 22 23 24 25 26  ",
    "27 28 29 30 31        ",
    "                      "
  ]
}

Хотя я не голосовал по вашему вопросу, учтите, что у нас уже есть несколько ответов, включая принятый, которые демонстрируют желаемый результат.
Джефф Шаллер

@JeffSchaller Сообщество Stack Exchange - это не форум. Его цель не ограничивается тем, чтобы помочь ОП разблокироваться. Цель состоит в том, чтобы заполнить глобальную базу знаний множеством вариантов, на которые искатели могут наткнуться при поиске ответов. Причина, по которой я назвал свой ответ, состоит в том, чтобы помочь пользователям распознать полезность этого ответа еще до того, как они нажмут на результат Google.
Бруно Броноски

Я хочу сказать, что в вашем ответе нет новых вариантов (ответов) для будущих читателей этого вопроса. У нас уже есть четыре ответа, которые используют варианты 1iдля вставки текста перед первой строкой. Кто-то с этим вопросом должен будет извлечь необходимые части из вашего ответа, чтобы решить свою проблему. Вопросы бесплатны, поэтому я бы пригласил вас задать свой вопрос и ответить на него, чтобы дать конкретный ответ.
Джефф Шаллер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.