Bash sed中s命令和寻址的正确语法
我想从bash脚本发出此命令Bash sed中s命令和寻址的正确语法,bash,sed,Bash,Sed,我想从bash脚本发出此命令 sed-e$开始,$s/pattern/$variable/file 但任何可能的引号组合都会给我一个错误,只有一个是有效的: sed-e“$start,$”'s/pattern/$variable/'文件 也不好,因为它不会取消对变量的引用 我的方法可以用sed实现吗?请随意切换引号。外壳可以使事情保持直线 sed -e "$beginning"',$s/pattern/'"$variable"'/' file 您可以尝试以下方法: $ sed -e "$beg
sed-e$开始,$s/pattern/$variable/file
但任何可能的引号组合都会给我一个错误,只有一个是有效的:sed-e“$start,$”'s/pattern/$variable/'文件
也不好,因为它不会取消对变量的引用
我的方法可以用sed实现吗?请随意切换引号。外壳可以使事情保持直线
sed -e "$beginning"',$s/pattern/'"$variable"'/' file
您可以尝试以下方法:
$ sed -e "$beginning,$ s/pattern/$variable/" file
例子
file.txt:
one
two
three
ONE
two
three
尝试:
输出:
one
two
three
ONE
two
three
下面的表单在脚本中为我工作
sed $beg,$ -e s/pattern/$variable/ file
如果从shell执行,同样的表单也可以使用。有两种类型的引号:
- 单引号保留其内容(
是提示): - 双引号允许参数扩展:
> var=blah > echo "$var" blah
$
符号:
- 一种方法是告诉shell下面是要展开的参数的名称
- 在sed中代表“最后一行”的一个
$
与参数无关sed "$beginning,\$s/pattern/$variable/" file
整个命令用双引号括起来,即参数被展开($start
和$variable
)。为了确保shell不会尝试展开不存在的$s
,会转义“行尾”$
,以便shell不会尝试任何有趣的操作
其他选择包括
- 重复引用所有内容,但在
和$
之间添加空格(请参阅)s
- 根据需要混合报价类型(参见)
$start
不是有效地址,模式
将被$variable
替换
sed "$beginning,$s/pattern/$variable/" file
双qoutes中的所有内容:参数都被展开,包括
$s
,它不应该(不遵循上面的规则1)。`sed-e“$begining,$s/pattern/$variable/”文件`That,并确保$variable
不包含任何//code>,或者更改s/模式/替换/
separator@JJoao从shell本身起作用,但从bash脚本sed:-e expression#1,char 1:unknown命令:`,
启动时会出现错误,这将导致各种奇怪的行为,因为shell变量可能包含各种内容。始终引用您的shell变量,除非您心里有一个非常具体的目标,不这样做,并且完全理解所有的含义。如果你不能准确地理解术语globbing、分词和文件名扩展,那么在你做这件事之前一定要研究它们,否则你就不会去做。有关正确的引用,请参阅。
sed "$beginning,$s/pattern/$variable/" file