замена многострочного шаблона в sed - PullRequest
10 голосов
/ 17 ноября 2011

Я просто хочу выполнить следующие действия:

заменить

EXTRATHING {
};

на

SOMETHING {};

во входном файле.Для этого я попытался

sed -e 's/EXTRATHING {\n};/SOMETHING/' input_file.txt  >outfile.txt

Это не работает.Может кто-нибудь подсказать, как правильно сделать это с помощью sed?

Ответы [ 6 ]

6 голосов
/ 17 ноября 2011
sed -n '1h;1!H;${;g;s/EXTRATHING {\n};/SOMETHING {};/g;p;}' input_file.txt

сделает это.

Проблема в том, что он сохраняет всю входную строку в буфере sed.

См. sed и Многострочный поиск и замена. для получения дополнительной информации и более эффективной версии.

3 голосов
/ 29 апреля 2013
 sed -i.bak '/EXTRATHING/{N;s//SOMETHING/;s/\n//}' input_file.txt
2 голосов
/ 26 февраля 2013

sed -e '/begin/,/end/{s/begin/replacement/p;d}'

1 голос
/ 14 января 2015

Это сложно сделать в sed, нужно писать подписки. Тем не менее, вы можете использовать однострочное использование perl:

perl -0777 -pe 's/EXTRATHING {\n/SOMETHING {/g' input_file.txt > outfile.txt

, где -0777 - разделитель записей (конечная строка в текстовых файлах) -p запускает команду для всех файлов и печатает на экране -e говорит, что это однострочная команда

1 голос
/ 29 апреля 2013
perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' your_file

проверено ниже:

> cat temp
fjbwjfbw
wefjkbwjk
jbefwejr
EXTRATHING {
};
ghekg
jhgjk
wefjkwngk
EXTRATHING {
  };
jbgvjnrg
jbfw
wefnkwk
EXTRATHING {
};
> perl -lne 's/\s*};\s*$/SOMETHING{};/g if(/\s*};\s*$/);$f=0;if(/EXTRATHING {\s*$/){next;$f=1}else{print}' temp
fjbwjfbw
wefjkbwjk
jbefwejr
SOMETHING{};
ghekg
jhgjk
wefjkwngk
SOMETHING{};
jbgvjnrg
jbfw
wefnkwk
SOMETHING{};
> 

, если вы хотите изменить встроенный файл. добавить флаг -i. как:

perl -i -lne '.......' your_file
0 голосов
/ 18 ноября 2011

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

 sed '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file.txt >output_file.txt

или если вы хотите отредактировать оригинальный файл:

sed -i '/^EXTRATHING {/,/^};/c\SOMETHING{}' input_file

РЕДАКТИРОВАТЬ: как требуется, вот пример:

cat <<! | sed '/^EXTRATHING {/,/^};/c\SOMETHING{}'
> aaa
> EXTRATHING {
> };
> bbb
> EXTRATHING {
> };
> ccc
> !
aaa
SOMETHING{}
bbb
SOMETHING{}
ccc

РЕДАКТИРОВАТЬ: Если первый и последний адреса являются последовательными строками, используйте это:

# cat <<\! | sed '/^EXTRATHING {/{N;s/^EXTRATHING {\n};/SOMETHING{}/}'
> aaa
> EXTRATHING {
> bbb
> };
> ccc
> EXTRATHING {
> };
> ddd
> !
aaa
EXTRATHING {
bbb
};
ccc
SOMETHING{}
ddd

Другой способ (возможно, проще?):

echo -e "EXTRATHING {\n};" | sed '$!N;s/^EXTRATHING {\n};/SOMETHING {};/;P;D'
SOMETHING {};
...