我有3个文本文件。我想搜索file3
一个字符串,file2
然后用file1
找到的一个字符串替换它。我需要在file1
其中的字符串末尾附加一个自定义标记,以file3
替换从中找到的部分字符串file2
。
file3
aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=arn:aws:iam::XXXXX:root
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=arn:aws:iam::XXXXX:user/user
file2
arn:aws:iam::XXXXX:root
arn:aws:iam::XXXXX:user/user
file1
my_custom_tag_1
my_custom_tag_2
所需的输出:
aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_1
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_2
我尝试将文件中的行加载到数组中,并在sed
替换中包含索引。
sed "s|${file2array[0]}|${file1array[0]}|g" file3.txt
但这将返回“没有以前的正则表达式”错误。我也尝试过使用for循环将数组索引写入唯一变量,并对变量使用与上面相同的方法
sed "s|$var2|$var1|g" file3.txt
这也失败了
有趣的是,
sed "s|${file2array[0]}|customtext}|g" file3.txt
失败但
sed "s|customtext|${file1array[0]}|g" file3.txt
成功。
任何帮助是极大的赞赏。现在已经为此工作了数十个小时。
尝试:
awk 'FNR==NR{a[FNR]=$0; next} NR<=length(a)+FNR{b[FNR]=$0; next} {for (i=1;i<=length(a);i++) gsub(a[i], b[i])} 1' file2 file1 file3
例如:
$ awk 'FNR==NR{a[FNR]=$0; next} NR<=length(a)+FNR{b[FNR]=$0; next} {for (i=1;i<=length(a);i++) gsub(a[i], b[i])} 1' file2 file1 file3
aws ec2 create-tags --region us-east-1 --resourcesi-XXXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_1
aws ec2 create-tags --region us-east-1 --resourcesi-XXXX --tags Key=Developer Name,Value=XXXXX Key=Resource Group,Value=my_custom_tag_2
FNR==NR{a[FNR]=$0; next}
这会将file2中的所有行保存在array中a
。
FNR是从当前文件读取的行数。NR是总共读取的行数。因此,如果FNR==NR
,我们正在读取第一个命名文件file2
。a[FNR]=$0
将当前行(表示为)添加$0
到a
键FNR下的数组中。
该命令next
告诉awk跳过其余命令,然后从头开始next
。
NR<=length(a)+FNR{b[FNR]=$0; next}
这会将file1的所有行保存在array中b
。
在这里,我们使用类似的测试NR<=length(a)+FNR
来确定是否正在读取第二个文件。b[FNR]=$0
将当前行(表示为)添加$0
到b
键FNR下的数组中。
该命令next
告诉awk跳过其余命令,然后从头开始next
。
for (i=1;i<=length(a);i++) gsub(a[i], b[i])
如果到达这里,我们正在读取第三个文件。这会将与file2中的一行匹配的任何文本替换为file1中的相应文本。
环路for (i=1;i<=length(a);i++)
循环通过在阵列的每一行的行号a
。
gsub(a[i], b[i])
用text替换所有出现a[i]
的text b[i]
。
请注意,file2中的文本被视为正则表达式。如果您需要在此文件中包含任何正则表达式有效字符,则应将其转义。
1
这是awk的在线打印的隐秘缩写。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句