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

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

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

26 голосов | спросил Tim Brigham 23 Jpm1000000pmMon, 23 Jan 2012 20:41:35 +040012 2012, 20:41:35

12 ответов


20
awk 'NR==1{print; print "new line"} NR!=1'
ответил Kevin 23 Jpm1000000pmMon, 23 Jan 2012 21:30:12 +040012 2012, 21:30:12
14

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

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.

ответил angus 23 Jpm1000000pmMon, 23 Jan 2012 21:31:03 +040012 2012, 21:31:03
6

Я думаю, что подход sed был бы следующим:

sed '2 i whatever_line_of_text_you_wanted_to_INSERT' filename.txt

Это приведет к получению текста во вторую строку файла, а затем вторая строка в файле станет третьей.

Обратите внимание, что при использовании append mode , если это необходимо, ему пришлось использовать первую строку, так как добавление произойдет после номера строки.

sed '1 a whatever_line_of_text_you_wanted_to_INSERT' filename.txt

ответил Nikhil Mulley 28 Jpm1000000pmSat, 28 Jan 2012 12:23:02 +040012 2012, 12:23:02
3
sed ':a;N;$!ba;s/\n/\n\n\n/' yourBigFile

Объяснение.

ответил Abhijeet Rastogi 23 Jpm1000000pmMon, 23 Jan 2012 21:19:38 +040012 2012, 21:19:38
2

Это может сработать для вас:

sed 1G file

Если вы хотите вставить something после новой строки:

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

Или если вы sed обрабатываете \n:

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

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

sed '1a something' file
ответил potong 26 Jpm1000000pmThu, 26 Jan 2012 18:08:44 +040012 2012, 18:08:44
1

Решение Python

python -c "import sys; lines = sys.stdin.readlines(); lines.insert(1,'New Line\n'); print ''.join(lines).strip()" < input.txt
ответил Rahul Patil 19 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowThu, 19 Sep 2013 16:21:23 +0400 2013, 16:21:23
0

Использование sed и (Bash-specific) escape-коды ANSI:

# note: \ --> \\
printf '%s\n' 1 2 3 4 5 | sed -e $'1 { s/\\(.*\\)/\\1\\\ninserted line/; }'
ответил topi 27 Jpm1000000pmFri, 27 Jan 2012 14:51:31 +040012 2012, 14:51:31
0

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

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

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

ответил Arcege 28 Jpm1000000pmSat, 28 Jan 2012 19:21:37 +040012 2012, 19:21:37
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 23 Jpm1000000pmMon, 23 Jan 2012 21:35:33 +040012 2012, 21:35:33
0

Мне просто нравится использовать явный счетчик:

awk '(c==1) {print "new line"} (c!=1) {print $0} {c++}' file
ответил Professor Awk 5 FebruaryEurope/MoscowbSun, 05 Feb 2012 01:51:00 +0400000000amSun, 05 Feb 2012 01:51:00 +040012 2012, 01:51:00
0

Простейший метод использует printf и ex:

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

1a означает «добавить после первой строки»; . завершает добавление; x означает сохранение и выход.

ответил Wildcard 12 AMpTue, 12 Apr 2016 04:52:55 +030052Tuesday 2016, 04:52:55
0

Ни один из вышеперечисленных ответов не упоминает о том, как сохранить изменения в исходном файле, что я думаю, о чем просил OP.

Это то, что мне нужно, когда я приступаю к странице.

Итак, предположим, что ваш файл называется output.txt

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

Моим конкретным вариантом использования является автоматическое добавление объявления стилей xsl в файл junit xml.

sed -i '1 a <?xml-stylesheet type="text/xsl" href="junit-html.xsl"?>' junit.xml
ответил chim 16 J0000006Europe/Moscow 2016, 13:08:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132