2016-08-24 4 views
2

У меня есть 4 разных команды sed, которые я запускаю в файле. И для того, чтобы настроить выполнение этих 4 команд, я хочу объединить их в один. Каждая команда представляет собой сложную команду с ключом -E. Искал много форумов, но не смог получить свой конкретный ответ.Как объединить несколько команд sed в один

sed -i -E ':a; s/('"$search_str"'X*)[^X&]/\1X/; ta' "$newfile" 
sed -i -E '/[<]ExtData[>?" "]/{:a; /Name=/{/Name="'"$nvp_list_ORed"'"/!b}; /Value=/bb; n; ba; :b; s/(Value="X*)[^X"]/\1X/; tb; }' "$newfile" 
sed -i -E ':a; s/('"$search_str1"'X*)[^X\<]/\1X/; ta' "$newfile" 
sed -i -E ':a; s/('"$search_str2"'X*)[^X\/]/\1X/; ta' "$newfile" 

И я хочу, чтобы объединить их что-то вроде

СЕПГ -i -E 'command1' -e 'command2' -e 'command3' -e 'command4' "$ NewFile"

Но он не работает. Потому что может быть -E и -e нельзя комбинировать.

Пожалуйста, дайте мне знать.

Спасибо! Пунит

+1

Если вы находитесь на Mac OSX или другой системе BSD, то для '-i' требуется аргумент. Достаточно пустого аргумента: 'sed -i '" -E -e' command1 '-e' command2 '-e' command3 '-e' command4 '"$ newfile" ' – John1024

+0

Предполагается, что' -E' должен быть '-r '? –

+0

@MadPhysicist В современном GNU sed (начиная с версии 4.2.1), '-r' и' -E' являются синонимами. В BSD работает только '-E'. Ходят слухи, что POSIX работает с стандартом «-E». – John1024

ответ

3

-E означает «расширенное регулярное выражение» и представляет собой автономный флаг, -e означает «выражение» и должно сопровождаться выражением sed.
Вы можете комбинировать их, но каждому из ваших выражений sed должно предшествовать -e, если вы хотите, чтобы их было несколько, что не относится к вашему первому.

sed -i -E -e 'command1' -e 'command2' -e 'command3' -e 'command4' "$newfile" 

Второй вариант заключается в написании каждой команды в одном выражении:

sed -i -E 'command1;command2;command3;command4' "$newfile" 

Однако, так как вы используете этикетки я бы не полагаться на этот вариант; некоторые реализации могут не поддерживать его, как указал John1024.

И наконец, как указано Mad Physicist, вы можете написать выражения sed в файл, который вы укажете через опцию -f.
Файл должен содержать одиночное выражение sed по строке (вы можете писать многострочные выражения, суффиксы каждой строки, а последние - \, тем самым избегая строки).

+0

Третья альтернатива, поместите все в сценарий. –

+0

BSD sed может не поддерживать ';' в сочетании с метками. OP использует метки. – John1024

+0

Спасибо @Aaron ваш первый вариант работал для меня как шарм !! –

2

Просто трубы их:

sed -E 'A' file | sed -E 'B' | ... >file.tmp && mv file.tmp file 
+0

Хотя это, безусловно, устранит необходимость временных файлов temp, это, вероятно, не так оптимально, как все с одной командой. +1 в любом случае. –

+0

@ John1024. Хороший звонок. Я думаю, что ответ означал '|' вместо '||' на основе слова «труба». И да, тогда флаг '-i' должен быть удален. До тех пор этот ответ вздор. –

+0

Благодарим вас за комментарий, исправлена ​​синтаксис. Во всяком случае, ответ @Aaron более результативен. –

2

Как заметил @Aaron, если вы хотите дать несколько отдельных выражений sed, вы должны указать их как -e; они будут объединены. Вы также можете комбинировать кучу выражений в одном, разделив куски на точки с запятой.

Ваш случай немного особенный: ваши конкретные выражения используют метки и инструкции ветвления, причем одно из имен меток (a) повторяется в каждом выражении. Чтобы их объединить, каждая метка должна быть различной, и каждая ветвь (условная и абсолютная) должна указывать правильную метку. Это будет выглядеть примерно так:

sed -i -E \ 
    -e ':a1; s/('"$search_str"'X*)[^X&]/\1X/; ta1' \ 
    -e '/[<]ExtData[>?" "]/ {:a2; /Name=/ {/Name="'"$nvp_list_ORed"'"/ !b}; /Value=/ bb2; n; ba2; :b2; s/(Value="X*)[^X"]/\1X/; tb2; }' \ 
    -e ':a3; s/('"$search_str1"'X*)[^X\<]/\1X/; ta3' \ 
    -e ':a4; s/('"$search_str2"'X*)[^X\/]/\1X/; ta4' \ 
    "$newfile" 

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

+1

Пример будет приятным. –

+0

@ Аарон, извините, я там был неряшлив. Исправленный. –

+0

Пример добавлен. –

Смежные вопросы