2016-12-17 3 views
0

Я пытаюсь изменить строки, как этотЗамена двух строк в SED

print("hc-takescreenshot: 'this is the description','1'") 
print("hc-takescreenshot: 'this is another description','2'") 
print("hc-takescreenshot: 'this is yet another description','3'") 

к этому

doscreenshot("This is the homepage", "1", self) 
doscreenshot("This is another homepage", "2", self) 
doscreenshot("This is yet another homepage", "3", self) 

я могу сделать что-то вроде этого

find='print(\"hc-takescreenshot: \x27' 
replace='doscreenshot("' 
sed -i -e "s/$find/$replace/g" $newpy 

Но что дело только с первая часть, мне тогда нужно заменить последний бит, например:, '3' ")

Что мне нужно, так это продлить замену, когда матч сделан.

+0

Пожалуйста, обратите внимание на: [Что я должен делать, когда кто-то отвечает мой вопрос?] (http://stackoverflow.com/help/someone-answers) – Cyrus

ответ

1

Предполагая, что вы хотите сохранить This is... описание строки (это не ясно читать ваш вопрос), вы можете попробовать это:

sed -i -e "s/.*: '\([^']*\)','\([0-9]*\)'.*/doscreenshot(\"\1\", \"\2\", self)/" "$newpy" 
+0

Были отсутствующие двойные кавычки, так на самом деле так: sed -i -e "s /.*: '\ ([^' ] * \) ',' \ ([0-9] * \) '. */Doscreenshot (\ "\ 1 \", \ "\ 2 \", self)/"" $ newpy "- кроме этого отлично сделал то, что я хотел, поэтому спасибо – mozman2

+0

Добро пожаловать @ mozman2. Я отредактировал, чтобы добавить отсутствующий '' '. – SLePort

0

На первый взгляд, не кажется, что будет метод для определения того, что, чтобы соответствовать и то, что заменить его, так что вы можете также использовать три различных -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).