Як вставити текст перед першим рядком файлу?


76

Я роздивлявся sedкоманду, щоб додати текст у файл у певному рядку. Це працює, додаючи текст за рядком 1:

sed '1 a\

Але я хочу додати його до рядка 1. Це було б:

sed '0 a\

але я отримую цю помилку: invalid usage of line address 0.

Будь-яка пропозиція?


Відповіді:


101

Скористайтеся опцією sedinsert ( 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.
підозрюваний

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 - друкує файл у консолі та> використовує його для надсилання до іншого файлу file1, а потім переміщуємо file1 на ім'я файлу, щоб текст вставився у перший рядок потрібного файлу.

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

7
Будь ласка , дайте мені знати , чому таке є downvoted
Анкіта Шах

1
Можливо тому, що в ОП згадується сед. На мою думку, це не заслуговує на голосування проти Таке рішення було навіть найкращим чином відповідати моїм потребам, а потім було схвалено.
рüффп

Я схвалив. працює на ksh для мене.
arcee123

16

Ви можете використовувати 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: fatal: не вдається відкрити файл" inplace "для читання"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 - го рядка (тобто до першого рядка).

Наступний рядок або кілька рядків - це буквальний текст, який потрібно додати.

Рядок .в рядку сам по собі припиняє команду "додати".

У 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

-1

Перший і останній

Я б припустив, що кожен, хто шукав, як вставити / додати текст до початку / кінця файлу, ймовірно, також повинен знати, як робити і інші.

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 роблять підстановки (останні застосовуються лише до "рядка <остання>"). Результатом є перетворення командного виводу в допустимий 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 Спільнота Exchange Exchange не є форумом. Її мета поширюється на те, щоб допомогти ОП розблокуватись. Мета полягає в засіданні глобальної бази знань багатьма варіантами, на які шукачі можуть натрапити, шукаючи відповіді. Я назвав свою відповідь причиною того, щоб допомогти користувачам розпізнати корисність цієї відповіді, перш ніж вони навіть натиснуть результат Google.
Бруно Броноський

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