Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 在bash脚本中用多行文本替换模式_Linux_Bash_Awk - Fatal编程技术网

Linux 在bash脚本中用多行文本替换模式

Linux 在bash脚本中用多行文本替换模式,linux,bash,awk,Linux,Bash,Awk,我有一个bash变量: VAR="This is \n what i want" 和包含以下内容的文件: asdf zxcv qwer 我想用$VAR(多行文本)替换zxcv的每一次出现 如何使用awk或sed进行此操作? 我试过: sed -i 's/zxcv/'$VAR'/g' filename sed -i "s/zxcv/$VAR/g" filename sed -i "s/zxcv/$(VAR)/g" filename sed -i "s/zxcv/$(($VAR))/g" fil

我有一个bash变量:

VAR="This is \n what i want"
和包含以下内容的文件:

asdf
zxcv
qwer
我想用$VAR(多行文本)替换zxcv的每一次出现

如何使用awk或sed进行此操作? 我试过:

sed -i 's/zxcv/'$VAR'/g' filename
sed -i "s/zxcv/$VAR/g" filename
sed -i "s/zxcv/$(VAR)/g" filename
sed -i "s/zxcv/$(($VAR))/g" filename
sed -i "s/zxcv/`echo -n $VAR`/g" filename

使用
gnu awk
,您可以通过在命令行上传递变量的值来实现这一点:

var=$'This is \n what i want'

awk -v var="$var" -v w='zxcv' 'n=index($0, w){
$0 = substr($0, 1, n-1) var substr($0, n + length(w))} 1' file

如果搜索词出现在单独的行中(如问题所示),则此命令可以简化为:

awk -v var="$var" -v w='zxcv' 'index($0, w)==1{$0 = var} 1' file

您也可以使用GNU
sed

$ var="This is \n what i want"
$ sed "s/^zxcv/$var/" file
asdf
This is 
 what i want
qwer
该键使用双引号而不是单引号,因此将
$var
的值插入到sed替换字符串中

(顺便说一句,按照惯例,用户变量在Bash中使用小写。)


从评论中可以看出:Ed Morton的版本更好,因为它使用了字符串连接,并且只将变量组件公开给shell解释:

$ sed 's/^zxcv/'"$var"'/' file

使用该

I have
gnu-sed
ver:
4.4
,此命令将为我提供
sed:-e表达式#1,char 16:unterminated
s'命令`Try
sed's/^zxcv/'$var'/'
。在编写时,整个命令将暴露给shell进行解释,而不仅仅是要扩展的变量。idk是否能解决问题,但使用正确的报价始终是一个很好的起点,值得一试。不幸的是,我在
gsed的/^zxcv/'“$var”/'文件中也遇到了同样的错误。我也在使用GNU sed 4.4(在cygwin上的bash 4.4.12(3)中),引用的两个版本对我都有效(我终于开始尝试它了:-)。我看到您使用的是
var=$'foo'
,而不是
var='foo'
。这就是问题所在-当我传递
\n
时,您正在将一个包含文字换行符的变量传递给sed。如果
var
包含一个
&
,这将以加密方式失败,就像任何sed解决方案一样(但sed也会在
\1
等情况下失败)。使用文字字符串…字符串
\n
应该保留在输出中,还是用文字换行符替换?是否希望“代码> \n/CODE >周围的空白字符保留在输出中或被删除?根据发布的输入发布预期的输出。
$ sed 's/^zxcv/'"$var"'/' file