Как я могу записать во вторую строку файла из командной строки?

29

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

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

Тим Бригам
источник

Ответы:

20
awk 'NR==1{print; print "new line"} NR!=1'
Kevin
источник
12
Немного короче:awk 'NR==2 {print "new line"} 1'
Гленн Джекман
@glennjackman: ваша версия не работает в моей системе, но ответ работает. В частности, у вас строка 2 дублируется, а новая строка вставляется между ними (так же, как строка 3).
Никана Рекламикс
Есть ли способ начать писать во 2-й строке и перезаписать все последующие строки?
CMCDragonkai
@CMCDragonkai Я не совсем уверен, что вы просите. Просто напечатать первую строку указанного файла и установить вторую строку? Первая строка, а затем содержимое файла? Первая строка первого файла, а затем строка из второго файла для каждой оставшейся строки в первом? Вы можете задать новый вопрос с очень конкретным описанием того, что вы хотите, и сравнительно коротким, но полным примером.
Кевин
16

Для вашего конкретного случая это должно быть проще:

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

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

  1. P Ринт линию
  2. E x изменить пространство шаблона с пространством хранения (в основном очищает буфер)

Затем строка (сейчас пустая) снова печатается как часть цикла.


Если вы хотите добавить новую строку вместо символа новой строки (то, что я понял изначально), просто используйте sedкоманду a\(append):

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'пример.
ангус
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

Или если вы сидите ручки \n:

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

Конечно aеще проще

sed '1a something' file
Potong
источник
Извините, что это делает?
Nikhil Mulley
Он вставляет новую строку после строки 1
potong
1
Или, скорее, добавляет новую \nстроку в первую строку!
потонг
1

Я обычно использую edдля этого:

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

Похоже на sedрешение, но без беспорядка сбежавших новых строк.

Arcege
источник
2
Вы можете сэкономить некоторые echo«S, особенно при bash: ed - filename <<< $'1a\nLine to insert\n.\nw'.
manatwork
1
Не работает во всех оболочках, например dash, во многих системах /bin/sh.
Arcege
1
Вот почему я написал «Вы могли бы сэкономить некоторые echo «s». Щадящая все echo «s действительно bashтолько функция, но уменьшая echoколичество от 4 до 1 работ в dashи kshтоже: echo '1a\nLine to insert\n.\nw' | ed - filename.
manatwork
1
Или просто используйтеprintf %s\\n , который ставит новую строку после каждого аргумента, который вы ей даете, и не портит специальные символы, вставленные в строку, которую вы хотите вставить. Кроме того, зачем использовать, edкогда exдоступно?
Wildcard
1

Python Solution

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt
Рахул Патил
источник
0

Использование sedи (специфичных для Bash) управляющих кодов 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()`
harish.venkat
источник
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значит сохранить и выйти.

Wildcard
источник
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.
chim