我试图使用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