String sed从一个文件中选取值并替换到另一个文件中

String sed从一个文件中选取值并替换到另一个文件中,string,bash,text,sed,replace,String,Bash,Text,Sed,Replace,我正在尝试将一个文件中的值替换为另一个文件中的值: { read -r val1 sed -i 's! nameserver .*; *$! nameserver '$val1';!;' testfile } < /etc/resolv.conf 但是,我从sed得到以下错误: sed:-e expression#1,char 2:unterminateds'command`在黑暗中拍摄,因为我不知道resolv.conf是如何配置的: gawk ' NR==FNR &

我正在尝试将一个文件中的值替换为另一个文件中的值:

{ read -r val1
  sed -i 's! nameserver .*; *$! nameserver '$val1';!;' testfile 
} < /etc/resolv.conf
但是,我从sed得到以下错误:
sed:-e expression#1,char 2:unterminated
s'command`

在黑暗中拍摄,因为我不知道resolv.conf是如何配置的:

gawk '
  NR==FNR && $1=="nameserver" {if(ns=$2) nextfile}                    #1
  NR!=FNR && $1=="resolver"   {print gensub(/[^ ]+/, ns, 2); next}    #2
  NR!=FNR                                                             #3
' /etc/resolv.conf testfile > tmp && mv tmp testfile                  #4
  • 从第一个文件中收集名称服务器
  • 插入收集的名称服务器,保留前导空格
  • 打印修改后的第二个文件
  • 文件更改前测试是否成功

  • 编辑:现在需要GNU Awk:
    gensub
    来动态保留前导空格,
    nextfile
    来跳过当前文件,一旦我们有了一个名称服务器

    测试文件中的示例数据就是上面的nginx配置。是的,我正在尝试从/etc/resolv.conf读取值(IP),并替换resolver之后的任何值(在上面的示例中是1.2.3.4)@SynRomana许多程序都可以访问/etc/resolv.conf;我们需要在您的计算机上查看它的结构才能正确回答这个问题。@vintnes我没有在/etc/resolv.conf中更改任何内容,我正在从中读取,它总是包含一行或多行包含
    nameserver 1.2.3.4
    的内容,这些行完成了操作,但在解析程序之前删除了前导空格。@SynRomana请参阅编辑以获取更清晰的内容,但非POSIX解决方案。
    gawk '
      NR==FNR && $1=="nameserver" {if(ns=$2) nextfile}                    #1
      NR!=FNR && $1=="resolver"   {print gensub(/[^ ]+/, ns, 2); next}    #2
      NR!=FNR                                                             #3
    ' /etc/resolv.conf testfile > tmp && mv tmp testfile                  #4