将一个文件中的文本替换为另一个文件中的文本

将一个文件中的文本替换为另一个文件中的文本

假设我有一个名为的文件,before.txt内容如下:

1  
2  
3  
4

但想要4用名为 .txt 的文本文件中的数字(按顺序)替换该数字after.txt。我该怎么做呢?

after.txt包含:

2743
3028
2850
1092
etc.

这也能变成剧本吗?如果是这样,我希望它按顺序循环遍历所有字符串,并如上所述after.txt替换字符串。4

答案1

awk '/^4$/&&getline<"after.txt"||1' before.txt

如果当前记录$0正是文本4,则从 获取下一行after.txt。如果成功,它将变为$0getline返回 1,因此表达式为 true 并且{print}触发默认操作。

如果记录不是4,或者 getline0EOFof处返回after.txt,则||1确保我们仍然打印当前记录。$0如果读取失败则不修改after.txt

如果getlinea 失败-1,我们仍然打印$0,因为这是一个非零返回码。

答案2

给定这些文件:

cat before.txt 
1  
2  
3  
4
1  
1  
2  
3  
4
2  
3  
4

cat after.txt
2743
3028
2850
1092

还有这个小脚本:

#!/bin/bash

while read -r line; do
    if [[ "$line"  == 4 ]]; then
        sed -n '1p' after.txt
        sed -i".bup" '1d' after.txt 
    else
        echo "$line"
    fi  
done < before.txt

我得到这个结果:

./script.sh 
1
2
3
2743
1
1
2
3
3028
2
3
2850

我确信有一个awkoneliner 可以做到这一点,但我说话不awk流利!另外,如果您想替换(“就地”)文件before.txt,则必须更改sed循环中的语句。否则,您可以简单地重定向STDOUT到一个新文件。在本例中,我选择将所有内容打印出来STDOUT以便于查看。


测试下操作系统 X 10.11.6和BSDsed

答案3

awk 中有类似的东西吗?

$ awk 'NR==FNR{Arr[NR]=$0;next}{if($0==4){i++;print Arr[i]}else{print}}' after.txt before.txt
1
2
3
2743
1
1
2
3
3028
2
3
2850

相关内容