我正在尝试更改这样的行
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 :(得分:1)
假设您要保留This is...
描述字符串(不清楚阅读您的问题),您可以试试这个:
sed -i -e "s/.*: '\([^']*\)','\([0-9]*\)'.*/doscreenshot(\"\1\", \"\2\", self)/" "$newpy"
答案 1 :(得分: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"
大括号将命令分组,以便只有4个替换命令才能操作与$find
匹配的行。这简化了匹配。 s//$replace/
使用sed
""重复使用最后一个正则表达式"能够避免在脚本中重复匹配字符串。
是的,如果您真的喜欢不可读的代码并且不需要多次执行此操作,那么您可以将所有脚本都压缩为单个-e
参数。但是,一旦发现需要进行多次运行,最好将其拆分以使其可读。另一种选择是创建一个包含普通script.sed
命令的文件(例如sed
)(无需担心shell对引号的处理):
/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)。