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


29

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

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

Ответы:


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

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

Извините, что это делает?
Nikhil Mulley

Он вставляет новую строку после строки 1
potong

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'.
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


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()`


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.
chim
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.