我搜索了这个主题并看到了一些例子但不知何故它对我不起作用。我必须在shell脚本(包含文件路径和扩展名)的文件中用另一行替换一行。我使用下面的命令,但替换不起作用。
<?php
exec("mode COM3 BAUD=9600 PARITY=N data=8 stop=1 xon=off");
$fp = fopen("com3", "r");
if (!$fp) {
echo "Not open";
} else {
$string = fgets($fp);
echo $string;
fclose($fp);
}
?>
sample.txt内容:
line='a|b|c|\\folder\file.txt'
upd_line='a|b|c|\\folder\file.txt|d'
sed -i 's#$line#$upd_line#g' sample.txt
我期待第二行被$ upd_line的内容替换,但它保持不变。请告诉我我做错了什么。我试着在bash和ksh中没有运气。
答案 0 :(得分:2)
会是这样的:
line="a|b|c|\\\\\\\folder\\\file.txt"
sed -i "s#$line#&|d#g" sample.txt
输出:
HDR|date
a|b|c|\\folder\file.txt|d
答案 1 :(得分:2)
这可能适合你(GNU sed&amp; bash):
a='a|b|c|\\folder\file.txt'
b='a|b|c|\folder\file.txt|d'
qs(){ sed <<<$1 's/[][\\.*^$]/\\&/g';}
sed "s/$(qs $a)/$(qs $b)/" file
这会创建一个函数qs
,它将变量字符串转换为sed regexp和替换中的接受形式。
N.B。在sed命令周围使用双引号;这允许shell插入shell变量和函数调用。如果在您选择的终端中使用GNU readline,C-M-e将在shell运行sed命令之前显示插值结果(您可能需要在运行它们之前重新引用结果)。
答案 2 :(得分:1)
perl
更适合quote operators
$ cat sample.txt
HDR|date
a|b|c|\\folder\file.txt
$ # adding |d to end of line
$ line='a|b|c|\\folder\file.txt'
$ perl -pe "s/$/|d/ if /\Q$line/" sample.txt
HDR|date
a|b|c|\\folder\file.txt|d
$ # generic search and replace
$ l='a|b|c|\\folder\file.txt' ul='a|b|c|\\folder\file.txt|d' perl -pe 's/\Q$ENV{l}/$ENV{ul}/' sample.txt
HDR|date
a|b|c|\\folder\file.txt|d
perl -i -pe
进行内部编辑-i
和-pe
选项