Bash awk/sed:如何使用两个文件执行嵌套替换操作?
我是bash操作的新手。我有两个文件,我们把它们称为文件A和文件B 在文件A中,我有这样一行: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 =
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的答案只需一个命令就能完成任务,但我认为你的答案更直观!谢谢