sed 搜索并替换另一个文件中的字符串

sed 搜索并替换另一个文件中的字符串

我需要一些建议来以单行方式使用 sed/awk 制作下面的 bash 脚本,或者如果我可以使用 python 来代替,那么对于执行此搜索和替换任务将非常有用。

在这里,我在名为“input.txt”的文件中创建了搜索模式,其中第一列用于搜索,第二列用于替换。然后,我将每个列值分配到数组上,并使用 sed 实用程序调用 for 循环来搜索和替换“file.csv”。此更改仅发生在第三列上。

文件.csv

Symbol,Name,Value
*,yy03LN-1,LM-GA-G01
*,yy5310-4,YP-QL-A03
*,yy5310-5,YP-QL-A10

输入.txt

LM-GA-G01,LM-GA-G1
YP-QL-A03,YP-QL-A3
YP-QL-A10,YP-QL-A10

预期结果,删除第三列“0”数字

文件.csv

Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10

我根据这种情况创建了一个 shell 脚本,效果更好,但我需要类似单行或短脚本的帮助来完成此任务。

#!/bin/bash
post=$(cat file.csv|awk -F "," '{print $NF}'| grep -v Index)
postar=($post)

for (( i=0; i<${#postar[@]}; ++i )); do
grep "${postar[$i]}" input.txt >> filtered.txt
done

left=$(cat filtered.txt|awk -F "," '{print $1}')
leftar=($left)
right=$(cat filtered.txt|awk -F "," '{print $2}')
rightar=($right)


for (( i=0; i<${#leftar[@]}; ++i )); do
sed -i -e 's/'"${leftar[$i]}"'/'"${rightar[$i]}"'/g' file.csv
done

input.txt请注意:-和的行数file.csv不同。

请建议

谢谢杰伊

答案1

以下使用CSV感知工具磨坊主( mlr) 删除字段值中嵌入的所有数字的零填充Value

$ mlr --csv put '$Value = gsub($Value, "([A-Z])0+([1-9])", "\1\2")' file
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10

使用该函数Value修改该字段,方法是匹配大写字母 ( ) 后面gsub()出现的任何数字(可能重复) ,后跟非零数字 ( )。任何此类匹配都将替换为大写字母和非零数字,从而删除填充整数的零字符串。0[A-Z][1-9]

mlr可以使用其选项就地执行修改-I

答案2

如果您的文件不太大,您可以使用awk

awk 'BEGIN{FS=OFS=","}
     NR==FNR{a[$1]=$2;next}
     {print $1,$2,($3 in a ? a[$3] : $3)}' input.txt file.csv
  • BEGIN{FS=OFS=","}将字段分隔符设置为,
  • NR==FNR如果编号记录等于文件编号记录(如果在第一个文件中)
  • a[$1]=$2使用第一个字段作为键将第二个字段存储到数组中
  • $3 in a ? a[$3] : $3if是print$3中的一个键else printaa[$3]$3

答案3

如果这不是您所需要的:

$ sed 's/0*\([0-9]*$\)/\1/' file.csv
Symbol,Name,Value
*,yy03LN-1,LM-GA-G1
*,yy5310-4,YP-QL-A3
*,yy5310-5,YP-QL-A10

然后编辑您的问题以提供更真实的代表性示例,其中包括不起作用的情况。

答案4

如果删除的不止一个0,可以动态生成sed程序。

 awk -F, '{printf "s/%s/%s/\n",$1,$2}' input.txt

在哪里

  • -F,告诉 awk 用作,分隔符,
  • printf "s/%s/%s/\n",$1,$2会产生替代

这给出了你的输入

s/LM-GA-G01/LM-GA-G1/
s/YP-QL-A03/YP-QL-A3/
s/YP-QL-A10/YP-QL-A10/

现在将其输入 sed

  awk -F, '{printf "s/%s/%s/\n",$1,$2}' input.txt | sed -i -f - file.csv

在哪里

  • -i使用就地版本
  • -f -使用来自 stdin 的 sed 指令(awk 生成的部分)

相关内容