Как использовать sed для замены только первого вхождения в файле?

195
задан kvantour 19 November 2018 в 04:00
поделиться

8 ответов

 # 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 

Источник

122
ответ дан fedorqui 23 November 2019 в 05:21
поделиться

Возможное решение:

    /#include/!{p;d;}
    i\
    #include "newfile.h"
    :
    n
    b

Объяснение:

  • строки чтения, пока мы не находим #include, печатают эти строки, тогда запускаются, новый цикл
  • вставляют новое, включают строку
  • , вводят цикл, который просто читает, строки (по умолчанию sed также распечатает эти строки), мы не возвратимся к первой части сценария отсюда
8
ответ дан mitchnull 23 November 2019 в 05:21
поделиться
#!/bin/sed -f
1,/^#include/ {
    /^#include/i\
#include "newfile.h"
}

, Как этот сценарий работает: Для строк между 1 и первое #include (после строки 1), если строка запускается с #include, то предварительно ожидают указанную строку.

Однако, если первое #include будет в гармонии 1, то и строке 1 и следующему последующему #include будут предварительно ожидать строку. При использовании GNU sed он имеет расширение, где 0,/^#include/ (вместо 1,) сделает правильную вещь.

12
ответ дан Chris Jester-Young 23 November 2019 в 05:21
поделиться

Просто добавьте количество возникновения в конце:

sed s/#include/#include "newfile.h"\n#include/1
11
ответ дан unexist 23 November 2019 в 05:21
поделиться

Вы могли использовать 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:-)

24
ответ дан richq 23 November 2019 в 05:21
поделиться

я сделал бы это с awk сценарием:

BEGIN {i=0}
(i==0) && /#include/ {print "#include \"newfile.h\""; i=1}
{print $0}    
END {}

затем выполните его с awk:

awk -f awkscript headerfile.h > headerfilenew.h

могло бы быть неаккуратным, я плохо знаком с этим.

2
ответ дан wakingrufus 23 November 2019 в 05:21
поделиться

Вариант использования может, возможно, быть то, что Ваши происшествия распространены всюду по Вашему файлу, но Вы знаете , Ваше единственное беспокойство находится в первых 10, 20 или 100 строках.

затем просто адресация те строки фиксируют выпуск - даже если формулировка OP расценивает сначала только.

sed '1,10s/#include/#include "newfile.h"\n#include/'
0
ответ дан 23 November 2019 в 05:21
поделиться
sed '0,/pattern/s/pattern/replacement/' filename

это сработало для меня.

пример

sed '0,/<Menu>/s/<Menu>/<Menu><Menu>Sub menu<\/Menu>/' try.txt > abc.txt

Примечание редактора: оба работают только с GNU sed .

56
ответ дан 23 November 2019 в 05:21
поделиться
Другие вопросы по тегам:

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