在sed中替换两个字符串

时间:2016-12-17 19:45:00

标签: 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'")

我需要做的是在匹配时扩展替换。

2 个答案:

答案 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转换为Thisdescription'转换为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)。