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
Bash awk/sed:如何使用两个文件执行嵌套替换操作?_Bash_Awk_Sed_Replace - Fatal编程技术网

Bash awk/sed:如何使用两个文件执行嵌套替换操作?

Bash awk/sed:如何使用两个文件执行嵌套替换操作?,bash,awk,sed,replace,Bash,Awk,Sed,Replace,我是bash操作的新手。我有两个文件,我们把它们称为文件A和文件B 在文件A中,我有这样一行: STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_A" STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_B" 在文件B中,我还有一个类似的行,其中只有字符串不同,如下所示: STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_A" STRING_TO_BE_SEARCHED =

我是bash操作的新手。我有两个文件,我们把它们称为文件A和文件B

在文件A中,我有这样一行:

STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_A"
STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_B"
在文件B中,我还有一个类似的行,其中只有字符串不同,如下所示:

STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_A"
STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_B"
我需要做的是在这两个文件中找到以
STRING\u开头的行,然后用A中的对应行替换文件B中的对应行


我怎样才能做到这一点?是否可以在单个命令中执行此操作

使用awk您可以做到这一点。这将首先扫描fileA,方法是扫描第一个文件中给定的搜索字符串,然后使用它替换fileB中的值

awk -v s='STRING_TO_BE_SEARCHED' 'BEGIN{ FS=OFS=" = " } FNR == NR && $1 == s {
a[$1] = $2; next } $1 in a { $2 = a[$1] } 1' fileA fileB
要将更改保存到
fileB
中,请使用:

awk -v s='STRING_TO_BE_SEARCHED' 'BEGIN{ FS=OFS=" = " } FNR == NR && $1 == s {
a[$1] = $2; next } $1 in a { $2 = a[$1] } 1' fileA fileB > $$.tmp && mv $$.tmp fileB

使用awk您可以做到这一点。这将首先扫描fileA,方法是扫描第一个文件中给定的搜索字符串,然后使用它替换fileB中的值

awk -v s='STRING_TO_BE_SEARCHED' 'BEGIN{ FS=OFS=" = " } FNR == NR && $1 == s {
a[$1] = $2; next } $1 in a { $2 = a[$1] } 1' fileA fileB
要将更改保存到
fileB
中,请使用:

awk -v s='STRING_TO_BE_SEARCHED' 'BEGIN{ FS=OFS=" = " } FNR == NR && $1 == s {
a[$1] = $2; next } $1 in a { $2 = a[$1] } 1' fileA fileB > $$.tmp && mv $$.tmp fileB

如果您没有任何特殊字符,也许两步
sed
更容易

key='STRING_TO_BE_SEARCHED *= *';          \
val=$(sed 's/'"$key"'//' fileA);           \
sed -r 's/('"$key"').*/\1'"$val"'/' fileB

STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_A"

您可以通过添加
-i
选项进行第二次
sed
替换。

如果您没有任何特殊字符,可能两步
sed
更容易

key='STRING_TO_BE_SEARCHED *= *';          \
val=$(sed 's/'"$key"'//' fileA);           \
sed -r 's/('"$key"').*/\1'"$val"'/' fileB

STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_A"

您可以通过添加
-i
选项进行第二次
sed
替换。

1-将行存储在变量lineA中

lineA=$(perl -ne 'if(/^\QSTRING_TO_BE_SEARCHED\E/){print;exit}' fileA)
2-替换文件B中的行,旧文件另存为.BAK

perl -i.BAK -pe 'BEGIN{$line=shift@ARGV}if(/^\QSTRING_TO_BE_SEARCHED\E/){$_="$line\n"}' "$lineA" fileB
或者创建新文件:fileB.new而不更改fileB

perl -pe 'BEGIN{$line=shift@ARGV}if(/^\QSTRING_TO_BE_SEARCHED\E/){$_="$line\n"}' "$lineA" fileB > fileB.new

1-将行存储在变量lineA中

lineA=$(perl -ne 'if(/^\QSTRING_TO_BE_SEARCHED\E/){print;exit}' fileA)
2-替换文件B中的行,旧文件另存为.BAK

perl -i.BAK -pe 'BEGIN{$line=shift@ARGV}if(/^\QSTRING_TO_BE_SEARCHED\E/){$_="$line\n"}' "$lineA" fileB
或者创建新文件:fileB.new而不更改fileB

perl -pe 'BEGIN{$line=shift@ARGV}if(/^\QSTRING_TO_BE_SEARCHED\E/){$_="$line\n"}' "$lineA" fileB > fileB.new

你期望什么样的产出?是否要永久更改文件B?两个文件中是否都有多行这样的内容?两个文件中只有一行这样的内容@chorobaYes,我想永久更改文件B。@123您希望得到什么输出?是否要永久更改文件B?两个文件中是否都有多行这样的内容?两个文件中只有一行这样的内容@chorobaYes,我想永久更改文件B。@123Lol什么,你甚至从未使用过变量。Lol:)打算使用但不知为何忘记,它现在已修复Lol什么,你甚至从未使用过变量。Lol:)打算使用但不知为何忘记,它已修复now@anubhava的答案只需一个命令就能完成任务,但我认为你的答案更直观!thanks@anubhava的答案只需一个命令就能完成任务,但我认为你的答案更直观!谢谢