sed для вставки только в первом матче - PullRequest
12 голосов
/ 02 апреля 2012

ОБНОВЛЕНИЕ:

Используя sed, как я могу вставить (НЕ ЗАМЕНЯТЬ) новую строку только в первое совпадение ключевого слова для каждого файла.

В настоящее время у меня есть следующее, но это вставляет для каждой строки, содержащей ключевое слово Matched, и я хочу, чтобы она вставляла только новую вставленную строку только для первого совпадения, найденного в файле:

sed -ie '/Matched Keyword/ i\New Inserted Line' *.*

Например:

Myfile.txt:

Line 1
Line 2
Line 3
This line contains the Matched Keyword and other stuff
Line 4
This line contains the Matched Keyword and other stuff
Line 6

изменено на:

Line 1
Line 2
Line 3
New Inserted Line
This line contains the Matched Keyword and other stuff
Line 4
This line contains the Matched Keyword and other stuff
Line 6

Ответы [ 4 ]

11 голосов
/ 02 апреля 2012

Если вы хотите один с sed *:

sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt

* работает только с GNU sed

9 голосов
/ 02 апреля 2012

Вы можете сделать это в GNU sed:

sed '0,/Matched Keyword/s//New Inserted Line\n&/'

Но это не портативно. Так как портативность хорошая, вот она в awk:

awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile

Или, если вы хотите передать переменную для печати:

awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile

Они оба вставляют текстовую строку перед первым появлением ключевого слова, на отдельной строке, в соответствии с вашим примером.

Помните, что для sed и awk ключевое слово matched является регулярным выражением, а не просто ключевым словом.

UPDATE:

Поскольку этот вопрос также помечен , вот простое решение, которое является чисто bash и не требует sed:

#!/bin/bash

n=0
while read line; do
  if [[ "$line" =~ 'Matched Keyword' && $n = 0 ]]; then
    echo "New Inserted Line"
    n=1
  fi
  echo "$line"
done

В таком виде это как труба. Вы можете легко обернуть это во что-то, что воздействует на файлы.

3 голосов
/ 02 апреля 2012

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

sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;$q;n;ba;}' *.*

Вы почти у цели!Просто создайте цикл для чтения от Matched Keyword до конца файла.

0 голосов
/ 12 февраля 2017

Если вы хотите добавить строку только после первого матча, используйте AWK вместо SED, как показано ниже

awk '{print} /Matched Keyword/ && !n {print "New Inserted Line"; n++}' myfile.txt

Выход:

Line 1
Line 2
Line 3
This line contains the Matched Keyword and other stuff
New Inserted Line
Line 4
This line contains the Matched Keyword and other stuff
Line 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...