文件 1
<filename1.txt> stringA string1
<filename2.txt> stringA string2
<filename2.txt> stringB string3
文件2
<filename1.txt> words and symbols < $ stringA words and symbols 9
<filename2.txt> more words and symbols % @ stringA words and symbols stringB
File2 已转换
<filename1.txt> words and symbols < $ string1 words and symbols 9
<filename2.txt> more words and symbols % @ string2 words and symbols string3
我的方法是遍历 File1 的行来设置变量。所以对于第 1 行,vars 设置为:
filenamevar = <filename1.txt>
string_old_var = stringA
string_new_var = string1
然后 grep 匹配 filenamevar 和 string_old_var 的行作为 sed 的输入。这就是我需要帮助的地方(除非您认为有更好的方法)。
到目前为止最接近的是
grep -e "$filenamevar.*$string_old_var" File2.txt | sed s/$string_old_var/$string_new_var/ >> File2Transformed.txt
除了第二行输出两次之外,它的工作原理:
<filename1.txt> words and symbols < $ string1 words and symbols 9
<filename2.txt> more words and symbols % @ string2 words and symbols stringB
<filename2.txt> more words and symbols % @ stringA words and symbols string3
我也试过
grep -e "$filenamevar.*$string_old_var" File2 | sed s/$string_old_var/$string_new_var/
和
sed -i s/$string_old_var/$string_new_var/ $(grep -e "$filenamevar.*$string_old_var" File2)
但两者都不会产生预期的结果。
这是我正在使用的循环
Numlines=$(grep "" -c File1.txt)
for (( line=1; line<=$Numlines; line++ )) ; do
filenamevar=$(awk -v line=$line 'NR == line {print $1}' File1.txt)
string_old_var=$(awk -v line=$line 'NR == line {print $2}' File1.txt)
string_new_var=$(awk -v line=$line 'NR == line {print $3}' File1.txt)
# insert proper sed grep code to test here
done
如果您决定为此使用 shell 循环,您可以执行类似的操作
但请注意,如果您的任何字符串包含正则表达式特殊字符序列,它可能会以意想不到的方式中断。另一种选择(对特殊字符具有相同的警告)将类似于
它用于
awk
将 File1 格式化为一系列命令,然后通过管道将其sed -f
用于修改 File2。使用支持 2D 数组的 GNU awk (aka
gawk
),您可以这样做:或者如果您需要保持对齐,请使用以下
index
功能substr
:vanilla awk 中的类似事情,用 FS 分隔的字符串伪造 2D 数组: