На первый взгляд, не кажется, что будет метод для определения того, что, чтобы соответствовать и то, что заменить его, так что вы можете также использовать три различных -e 's/…/…/'
пар аргументов в одном вызове sed
:
newpy=data
find='print(\"hc-takescreenshot: '\'
replace='doscreenshot(' # Dropped "
sed -e "s/$find.*1'\")/$replace\"This is the homepage\", \"1\", self)/" \
-e "s/$find.*2'\")/$replace\"This is another homepage\", \"2\", self)/" \
-e "s/$find.*3'\")/$replace\"This is yet another homepage\", \"3\", self)/" \
"$newpy"
\x27
, используемый в вопросе, не работал на Mac (с Bash 3); Вместо этого я использовал \'
, чтобы добавить одну цитату в конец find
.
Однако более интенсивное исследование показывает, что (а также изменение вызова функции), вы можете конвертировать this
в This
и description'
к homepage"
и оригинальный одинарных кавычках числа в двойных кавычках числа с последующим , self
. Если это точное, то вы можете сделать это с помощью:
find='print(\"hc-takescreenshot: '\'
replace='doscreenshot("' # Reinstated "
sed -e "/$find/ {" \
-e "s//$replace/" \
-e "s/this/This/" \
-e "s/description'/homepage\"/" \
-e "s/'\([0-9]\)'\"/ \"\1\", self/" \
-e "}" \
"$newpy"
Скобки группы команд между ними так, что только строками, которые соответствуют $find
оперируют команды 4 замещения. Это упрощает сопоставление. s//$replace/
использует «повторное использование последнего регулярного выражения» sed
, чтобы избежать повторения строки соответствия в скрипте.
Да, вы можете использовать весь сценарий в одном аргументе -e
, если вам действительно нравится нечитаемый код, и вам не нужно будет делать это более одного раза. Однако, как только вы обнаружите, что вам нужно сделать несколько прогонов, лучше разбить вещи так, чтобы они были читабельны. Другим вариантом было бы создать файл (например, script.sed
), содержащий простые sed
команды (без необходимости беспокоиться об обработке командного интерпретатора кавычек):
/print("hc-takescreenshot: '/ {
s//doscreenshot("/
s/this/This/
s/description'/homepage"/
s/'\([0-9]\)'"/ "\1", self/
}
, а затем вы можете запустить:
sed -i.bak -f script.sed "$newpy"
Для 3-х линий ввода, показанного в этом вопросе, все три сценария генерировать ответ:
doscreenshot("This is the homepage", "1", self)
doscreenshot("This is another homepage", "2", self)
doscreenshot("This is yet another homepage", "3", self)
Весь код, протестированный на macOS Sierra 10.12.2 с BSD sed
и GNU sed
и Bash 3.2.57 (1).
Пожалуйста, обратите внимание на: [Что я должен делать, когда кто-то отвечает мой вопрос?] (http://stackoverflow.com/help/someone-answers) – Cyrus