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

时间:2017-05-11 14:11:02

标签: bash awk sed replace

我是打击行动的完全新手。我有两个文件,我们称之为文件A和文件B.

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

STRING_TO_BE_SEARCHED = "SOME_STRING_IN_FILE_B"

在文件B中,我也有一个类似的行,只有字符串不同,如下所示:

STRING_TO_BE_SEARCHED

我需要做的是在两个文件中找到以{{1}}开头的行,并用A中相应的行替换文件B中的相应行。

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

3 个答案:

答案 0 :(得分:2)

使用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

答案 1 :(得分:1)

如果你没有任何特殊字符,或许两步require("ggplot2") require("gridExtra") dataToPlot <- data.frame( "Person" = c("Alice", "Bob", "Carlton"), "Age" = c(14, 63, 24), "Score" = c(73, 62.1, 21.5)) plot1 <- ggplot(dataToPlot) + geom_bar(data = dataToPlot, aes(x = Person, y = Score), stat = "identity", fill = "blue", width = 0.8) + scale_y_continuous(trans = "reverse", expand = c(0, 0)) + scale_x_discrete(position = "top") + theme( axis.text.y = element_blank() ) + labs(x = NULL) + coord_flip() plot2 <- ggplot(dataToPlot) + geom_bar(data = dataToPlot, aes(x = Person, y = Age), stat = "identity", fill = "red", width = 0.8) + scale_y_continuous(expand = c(0, 0)) + theme( axis.text.y = element_text(size = 20, hjust = 0.5) ) + labs(x = "") + coord_flip() gridExtra::grid.arrange(plot1, plot2, ncol = 2, widths = c(1, 1.2)) 更容易

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" 选项进行第二次sed替换。

答案 2 :(得分:1)

1-将行存储在变量lineA

lineA=$(perl -ne 'if(/^\QSTRING_TO_BE_SEARCHED\E/){print;exit}' fileA)

2-替换fileB中的行,旧文件保存为.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
相关问题