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

标签 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" 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

asdf
This is
 what i want
qwer

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

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

关于linux - 在 bash 脚本中用多行文本替换模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50491023/

相关文章:

awk - 正则表达式 "^[[:digit:]]$"在 AWK/GAWK 中没有按预期工作

linux - 如何更改 bash 历史完成以完成已经上线的内容?

linux - 使用取消共享并仍在执行原始功能

c++ - 是什么导致我的堆栈中出现神秘的重复条目?

linux - 以下 "top"命令: top -p `pgrep process-name | tr "\\n" "," | sed 's/,$//' `的语法简单解释是什么

linux - 在 Hortonworks Distribution 中归档 HDFS 文件时出现 AWK 使用问题

linux - 将发送电子邮件脚本添加到 pingall bash 脚本

regex - 在 unix 中的字符串中第二次出现后删除所有内容

c - 如何使用 setenv 为 bash 数组设置值

bash - 如何从 Linux 命令行获取字符串的显示宽度?