我正在尝试使用sed在开始和结束字符之间获取一些字符。这些打开和关闭字符可以是大括号,例如{和}等。在我的特定情况下,开头字符是=
,结束字符是该行的结尾。
在PHP中,我有一个通常适用于我的正则表达式:([^\^]*?)
。然而,由于sed使用POSIX-BRE风味,我不相信这会起作用。
我正在使用正则表达式的字符串可能是这样的:password=mailPASSWORD
。 mailPASSWORD可以包含常规字母字符和特殊字符。
所以我想替换mailPASSWORD并输入我自己的密码。
sed -i -r "s/password[ ]*=[ ]*([pattern_goes_here])/password=mypassword/" /myfile
我很感激一些帮助。
提前致谢
修改
在查看sed的其他替代方案后,我发现perl实际上是一种更好的工具。而且,正如我的正则表达式知识基于perl一样,它看起来是更好的方式。
以下是我将如何解决同样的问题:
perl -p -i -e "s/password *= *[^\n]*/password=mypassword/" /myfile
由于我是逐行完成的,所以只是让脚本变得更容易。
答案 0 :(得分:2)
针对您的具体情况:
sed -i -r -e 's/password *= *[^\t ]*/password=mypassword/' /myfile
对于更一般的情况,如果结束分隔符是一个字符,让我们说x
,你可以模拟这个:
.*?x
用这个:
[^x]*x
对于多字符结束分隔符,它变得更复杂,但这是基本的想法:而不是非贪婪匹配,创建一个匹配所有但结束分隔符的模式。
答案 1 :(得分:2)
使用sed
:
[jaypal:~] sed 's/\(.*[^=]=\)[[:alnum:]]\+/\1mypassword/' <<< password=mailPASSWORD
password=mypassword
使用awk
[jaypal:~] awk -F"=" '{$2="mypassword";print $1"="$2}' <<< password=mailPASSWORD
password=mypassword
答案 2 :(得分:0)
这可能对您有用:
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