Sed查找/内联替换,转义一些字符

时间:2016-05-10 17:04:11

标签: regex linux bash sed find

我有一堆数据库连接设置,我需要替换,并希望有人在这里指出我与sed正确的方向。通常我使用find和sed组合来执行此操作,如下所示:

sudo find . -name "*.php" -print0 |
sudo xargs -0 sed -i '' -e 's#:/usr/share/php/pear:#:/usr/lib/php5/pear/:/usr/share/php/pear:#g'

但是对于DB连接字符串,我需要替换看起来像这样的行:

define('DBUSER', 'dbuser');

出于各种原因,我不能仅对用户名本身进行sed,因此我需要更严格地定义可替换文本。不幸的是,我对正则表达式的有限技巧使我无法正确地逃避整个序列,因此可以通过sed找到并正确替换。我需要做什么才能基本上使用我通常用来替换那些DBUSER字符串中的用户名的find / sed命令?我尝试使用反斜杠 - 单引号转义,以及双引号每个单引号,但没有一个有效。这是一个最新的Ubuntu 14.04系统,没有任何花哨的定制。

提前感谢您提供的任何帮助。我真的很感激。

2 个答案:

答案 0 :(得分:1)

您可能需要三个反斜杠来表示regexp中的单引号字符。这就是原因:

#include <cstdlib>
#include<stdio.h>

int main(int argc, char** argv) {
    int testInteger;
    int a = 1;
    while (a==1){
        printf("Enter an integer: ");
        scanf("%d",&testInteger);  
        if (testInteger == 0){
            printf("Quitting program!");
            return 0;
        }else{
            printf("You entered the number = %d\n",testInteger);
        }         
    }
    return 0;    
}

编辑:实际上这对public static void main(String[] args) throws InterruptedException, IOException{ ProcessBuilder pb = new ProcessBuilder("./i_o_test"); Process process = pb.start(); InputStream is = process.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); String line; while ((line=br.readLine()) != null){ System.out.println(line); } } 不起作用。但是如果在正则表达式周围使用双引号,则只需要一个反斜杠:

~$ echo 'sdfsdf'
sdfsdf
~$ echo \'sdfsdf\'
'sdfsdf'
~$ echo \\'sdfsdf\\'
\sdfsdf\\
~$ echo \\\'sdfsdf\\\'
\'sdfsdf\'

答案 1 :(得分:0)

无论你使用什么工具(sed,awk等),无论你试图逃脱多少次,shell都不允许你在单引号分隔的shell脚本中使用单引号它

使用sed执行此操作的常用方法是在sed命令行中添加单引号,以便瞬间跳回sed并进入shell:

sed 'in sed'back in shell'in sed'

并在那里退出单引号

sed 'in sed'\''in sed'

具体做法是:

$ echo "foo define('DBUSER', 'dbuser'); bar" |
    sed 's/define('\''DBUSER'\'', '\''dbuser'\'');/you win $100/'
foo you win $100 bar

$ echo "foo define('DBUSER', 'dbuser'); bar" |
    sed 's/define('\''DBUSER'\'', '\''dbuser'\'');/voila!/'
foo voila! bar

永远不要将sed脚本或任何其他脚本用双引号括起来而不是单引号(另一种经常提出的解决此问题的方法),因为虽然似乎简单,但大多数事情似乎很简单shell编程,它非常脆弱,然后你必须注意并处理变量扩展和其他问题,例如:

$ echo "foo define('DBUSER', 'dbuser'); bar" |
    sed "s/define('DBUSER', 'dbuser');/you win $100/"
foo you win 00 bar

$ echo "foo define('DBUSER', 'dbuser'); bar" |
    sed "s/define('DBUSER', 'dbuser');/voila!/"
-bash: !/: event not found