我有一堆数据库连接设置,我需要替换,并希望有人在这里指出我与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系统,没有任何花哨的定制。
提前感谢您提供的任何帮助。我真的很感激。
答案 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