使用Sed获取打开和closures字符之间的所有字符

我试图使用sed来获取开始和结束字符之间的一些字符。 这些开始和结束字符可以是括号,例如{和}等。在我的具体情况下,开始字符是= ,结束字符是行的结尾。

在PHP中,我有一个通常为我工作的正则expression式([^\^]*?) 。 但是,因为sed使用POSIX-BRE的味道,我不相信这会起作用。

我正在使用正则expression式的string可能是这样的: password=mailPASSWORD 。 mailPASSWORD可以包含常规字母字符以及特殊字符。

所以我想replacemailPASSWORD并把我自己的密码。

 sed -i -r "s/password[ ]*=[ ]*([pattern_goes_here])/password=mypassword/" /myfile 

我会很感激一些帮助。

提前致谢

编辑

在看了sed的其他select之后,我发现perl实际上是这类事情的一个更好的工具。 因为我的正则expression式知识基于perl,所以看起来更好。

以下是我将如何解决同样的问题:

 perl -p -i -e "s/password *= *[^\n]*/password=mypassword/" /myfile 

由于我一行一行地做东西,所以让脚本变得更容易。

对于您的具体情况:

 sed -i -r -e 's/password *= *[^\t ]*/password=mypassword/' /myfile 

对于更一般的情况,如果结束分隔符是一个字符,比方说,你模拟这个:

 .*?x 

有了这个:

 [^x]*x 

对于多字符结尾分隔符来说,它变得更加复杂,但这是基本的想法:不是非贪婪匹配,而是创建一个匹配除了结尾分隔符之外的所有内容的模式。

sed

 [jaypal:~] sed 's/\(.*[^=]=\)[[:alnum:]]\+/\1mypassword/' <<< password=mailPASSWORD password=mypassword 

awk

 [jaypal:~] awk -F"=" '{$2="mypassword";print $1"="$2}' <<< password=mailPASSWORD password=mypassword 

这可能适合你:

 echo 'someotherpassword=xxx password = mailPASSWORD_with_an_=_sign another=yyy' | sed 's/^\(.*\<password\s*=\s*\)\S*/\1mypassword/' someotherpassword=xxx password = mypassword another=yyy 

如果你不想保留=符号的任何一边的空格,那么:

 echo 'someotherpassword=xxx password = mailPASSWORD_with_an_=_sign another=yyy' | sed 's/^\(.*\<password\)\s*=\s*\S*/\1=mypassword/' someotherpassword=xxx password=mypassword another=yyy 

如果该行只包含一个密码分配,则:

 echo 'password = mailPASSWORD_with_an_=_sign' | sed 's/\(=\s*\)\S*/\1mypassword/' password = mypassword 

或者没有空格:

 echo 'password = mailPASSWORD_with_an_=_sign' | sed 's/\s*=.*/=mypassword/' password=mypassword