【问题标题】:Copy a content from one file and need to replace in another file using sed从一个文件复制内容并需要使用 sed 在另一个文件中替换
【发布时间】:2021-10-04 23:27:23
【问题描述】:

在这里,我们有两个文件。我们需要从文件 1 中复制一个密钥,并且需要使用 sed 命令用特定的字符串“key”替换文件 2 中的密钥。我们尝试了以下命令:

sed -e '3 /key/{r file1' -e 'd}' file2

sed  -n "3 s/key/$(cat file 1 |grep ^Key|cut -d ' ' -f2)/" file2

文件 1

ABCD
EFGH 
Key: qvUkD6QaFBA1jYEpynivMoQx+9V71F4+fdn1TIUKPBNny/3zCnjihd1mwxZg==

文件 2

IJKL
MNOP
secret key;
MNOP

预期结果:

IJKL
MNOP
secret qvUkD6QaFBA1jYEpynivMoQx+9V71F4+fdn1TIUKPBNny/3zCnjihd1mwxZg==;
MNOP

【问题讨论】:

  • 它是否必须被sed? we need to copy a key from file 1您不想先提取文件1中的键值吗? $(cat file1)整个文件,不是关键。
  • 太好了,所以看看 shell 中单引号和双引号之间的区别 - 您在上面的 sed 命令中尝试了单引号。此外,它是第 3 行,而不是 11,并且该行包含 secret ,而不是 key
  • 远程-n,所以它会打印一些东西。
  • @KamilCuk,感谢您的回复,请正确转发问题!实际上行包含秘密旁边的key

标签: linux bash sed sh


【解决方案1】:

这可能对你有用(GNU sed):

sed -nE '/Key: /{s///;s/\W/\\&/g;s#.*#s/"key"/&/#p}' file1 | sed -Ef - file2

从 file1 中创建一个替换命令,不要忘记引用非单词字符。

将 sed 替换命令作为 stdin 传递给通过 -f 选项对 sed 的第二次调用,并使用它来编辑文件 2。

【讨论】:

    【解决方案2】:

    awk

    我不确定我的代码对您的使用效率有多高。

    awk ' /^Key/{q=$2;next} /A|E/{$0=""; next}/^secret/{$2="\""q"\";"}1' $file1 $file2
    
    $ awk ' /^Key/{q=$2;next} /A|E/{$0=""; next}/^secret/{$2="\""q"\";"}1' $file1 $file2
    IJKL
    MNOP
    secret "qvUkD6QaFBA1jYEpynivMoQx+9V71F4+fdn1TIUKPBNny/3zCnjihd1mwxZg==";
    MNOP
    

    在这里,我匹配以 Keysecret 字符串开头的任何行并替换它们的值。

    sed

    您需要先创建一个变量来获取key

    key=$(sed '1,2d;s/Key: //' $file1)key=$(awk 'NR==3{print $2}' $file1)

    $ echo $key
    qvUkD6QaFBA1jYEpynivMoQx+9V71F4+fdn1TIUKPBNny/3zCnjihd1mwxZg==
    

    以下代码将生成您预期的结果,但我再次不确定它对您的使用效率有多高。

    sed "/^secret/s|key|$key|" $file2
    
    $ sed "/^secret/s|key|$key|" $file2
    IJKL
    MNOP
    secret "qvUkD6QaFBA1jYEpynivMoQx+9V71F4+fdn1TIUKPBNny/3zCnjihd1mwxZg==";
    MNOP
    

    【讨论】:

    • 谢谢!这种方法为我们取得了完美的结果。但是,我们按照以下所述更改了命令:key=$(cat file1 |grep ^Key|cut -d ' ' -f2)sed "3 s|key|$key|" file2
    • 很高兴听到它对您有用,但为什么要先 cat 您的文件?您可以将其简化为 key=$(grep ^Key $file1 | cut -d' ' -f2) 以创建变量。
    • 是的!我们会检查的。
    猜你喜欢
    • 2014-03-15
    • 2019-11-12
    • 1970-01-01
    • 2017-05-25
    • 2013-01-10
    • 2021-04-26
    • 2020-11-19
    • 1970-01-01
    • 2011-06-04
    相关资源
    最近更新 更多