使用Sed获取开始和结束字符之间的所有字符

时间:2011-12-29 18:17:07

标签: regex linux perl sed

我正在尝试使用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

由于我是逐行完成的,所以只是让脚本变得更容易。

3 个答案:

答案 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