Як я можу записати до другого рядка файлу з командного рядка?


29

У мене є зовнішня програма, яка виробляє вихідний файл (великі, можливі 20K рядків).

Мені потрібно вставити новий рядок між існуючим рядком 1 та рядком 2. Я дивився на awk та sed - я використовую один вкладиш у кожному досить регулярно - але мені не вдалося придумати правильні перемикачі на зробити це.

Відповіді:


20
awk 'NR==1{print; print "new line"} NR!=1'

12
Трохи коротше:awk 'NR==2 {print "new line"} 1'
glenn jackman

@glennjackman: Ваша версія не працює в моїй системі, але відповідь є. Зокрема, з вашим, рядок 2 дублюється, а новий рядок вставляється між обома (так, як рядок 3).
Nikana Reklawyks

Чи є спосіб почати писати на другому рядку та перезаписати всі наступні рядки?
CMCDragonkai

@CMCDragonkai Я не зовсім впевнений, що ти просиш. Просто надрукуйте перший рядок вказаного файлу та встановлений другий рядок? Перший рядок, а потім вміст файлу? Перший рядок першого файлу, а потім рядок з другого файлу для кожного решти, що залишився в першому? Ви можете задати нове запитання з дуже конкретним описом того, що ви хочете, і порівняно коротким, але повним прикладом.
Кевін

16

Для вашого конкретного випадку це має бути простішим:

sed '1 { P ; x }' your-file

Пояснення: у рядку 1 виконайте наступне

  1. П р а р і д і л і
  2. E x змінить простір шаблону на простір утримування (в основному спорожнює буфер)

Потім рядок (порожній зараз) друкується знову як частина циклу.


Якщо ви хочете додати новий рядок замість нового символу рядка (що я зрозумів спочатку), просто використовуйте sedкоманду a\(додавати):

sed '1 a\
appended line' your-file

або навіть

sed '1 aappended line' your-file

Він додається appended lineпісля рядка 1.


1
sed -i '1 a\\' fileлише для нового рядка.
forcefsck

1
@forcefsck Так, єдиним недоліком є ​​те, що це GNUism, як мій другий '1 aapended line'приклад.
angus

8

Я думаю, sedпідхід був би таким:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Це отримає текст у другий рядок файла, і тоді фактичний другий рядок у файлі стане третім.

Зауважте, що, використовуючи режим додавання , якщо він мав бути, він повинен був використовувати перший рядок, оскільки додавання відбудеться після зазначення номера рядка.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt



2

Це може допомогти вам:

sed 1G file

Якщо ви хочете вставити somethingпісля нового рядка:

sed '1{G;s/$/something/}' file

Або якщо ви ручки sed \n:

sed '1s/$/\nsomething/' file

Звичайно a, ще простіше:

sed '1a something' file

Мені шкода, що це робить?
Nikhil Mulley

У ньому вставляється
нова

1
А точніше, додає новий рядок \nдо рядка!
потонг

1

Я зазвичай використовую edдля цього:

(echo 1a; echo 'Line to insert'; echo .; echo w) | ed - filename

Схожий на sedрішення, але без захаращення вирваних нових рядків.


2
Ви можете заощадити деякі echo«S, особливо при bash: ed - filename <<< $'1a\nLine to insert\n.\nw'.
манатура

1
Працює не у всіх оболонках, наприклад dash, у багатьох системах /bin/sh.
Арседж

1
Ось чому я написав "Ви могли пощадити деяких echo ". Щадна все echo «s дійсно bashтільки функція, але зменшуючи echoкількість від 4 до 1 робіт в dashі kshтеж: echo '1a\nLine to insert\n.\nw' | ed - filename.
манатура

1
Або просто використовуватиprintf %s\\n , що ставить новий рядок після кожного аргументу, який ви йому надаєте, і не накручує спеціальні символи, вбудовані у рядок, який ви хочете вставити. Крім того, навіщо використовувати, edколи exце доступно?
Уайлдкард

1

Рішення Python

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt

0

Використання sedта (специфічні для Баша) ANSI коди евакуації:

# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'

0

Я би використовував python для цього

import fileinput

for linenum,line in enumerate(fileinput,FileInput("file",inplace=1)):
    if linenum ==1:
          print ""
          print line.rstrip() 
      else: 
          print line.rstrip()`

0

Мені просто подобається використовувати явний лічильник:

awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file

0

Найпростіший метод використовує printfі ex:

printf '%s\n' 1a 'my line to insert' . x | ex file

1aозначає "додавати після першого рядка"; .закінчує цю директиву; xозначає зберегти та вийти.


0

Жодна з наведених вище відповідей не згадує, як зберегти зміни в оригінальному файлі, тобто я думаю, про що вимагала ОП.

Це, звичайно, те, що мені було потрібно, коли я переходив на сторінку.

Тож припустимо, що ваш файл називається output.txt

sed -i '1 a This is the second line' output.txt

Мій особливий випадок використання - це автоматично додати декларацію стилів xsl до файлу xml у junit.

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml

yourownlinux.com/2015/04/… є відповідною частиною добре написаного вступу до sed.
шим
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.