# sed script to change "foo" to "bar" only on the first occurrence
1{x;s/^/first/;x;}
1,/foo/{x;/first/s///;x;s/foo/bar/;}
#---end of script---
или, если Вы предпочитаете: <глоток> Примечание редактора: работы с GNU sed
только.
sed '0,/RE/s//to_that/' file
Возможное решение:
/#include/!{p;d;}
i\
#include "newfile.h"
:
n
b
Объяснение:
#!/bin/sed -f
1,/^#include/ {
/^#include/i\
#include "newfile.h"
}
, Как этот сценарий работает: Для строк между 1 и первое #include
(после строки 1), если строка запускается с #include
, то предварительно ожидают указанную строку.
Однако, если первое #include
будет в гармонии 1, то и строке 1 и следующему последующему #include
будут предварительно ожидать строку. При использовании GNU sed
он имеет расширение, где 0,/^#include/
(вместо 1,
) сделает правильную вещь.
Просто добавьте количество возникновения в конце:
sed s/#include/#include "newfile.h"\n#include/1
Вы могли использовать awk, чтобы сделать что-то подобное..
awk '/#include/ && !done { print "#include \"newfile.h\""; done=1;}; 1;' file.c
Объяснение:
/#include/ && !done
Выполнения оператор действия между {}, когда строка соответствует "#include" и мы уже не обработали его.
{print "#include \"newfile.h\""; done=1;}
Это печатает #include "newfile.h", мы должны выйти из кавычек. Тогда мы устанавливаем сделанную переменную на 1, таким образом, мы не добавляем, больше включает.
1;
Это означает, "распечатывают строку" - пустое действие значения по умолчанию для печати 0$, который распечатывает целую строку. Один лайнер и легче понять, чем sed IMO:-)
я сделал бы это с awk сценарием:
BEGIN {i=0}
(i==0) && /#include/ {print "#include \"newfile.h\""; i=1}
{print $0}
END {}
затем выполните его с awk:
awk -f awkscript headerfile.h > headerfilenew.h
могло бы быть неаккуратным, я плохо знаком с этим.
Вариант использования может, возможно, быть то, что Ваши происшествия распространены всюду по Вашему файлу, но Вы знаете , Ваше единственное беспокойство находится в первых 10, 20 или 100 строках.
затем просто адресация те строки фиксируют выпуск - даже если формулировка OP расценивает сначала только.
sed '1,10s/#include/#include "newfile.h"\n#include/'
sed '0,/pattern/s/pattern/replacement/' filename
это сработало для меня.
пример
sed '0,/<Menu>/s/<Menu>/<Menu><Menu>Sub menu<\/Menu>/' try.txt > abc.txt
Примечание редактора: оба работают только с GNU sed
.