我需要帮助替换文件中的字符串,其中“from” - “to”来自给定文件的字符串。
fromto.txt:
"TRAVEL","TRAVEL_CHANNEL"
"TRAVEL HD","TRAVEL_HD_CHANNEL"
"FROM","TO"
第一列是我要搜索的内容,将替换为第二列。
到目前为止,我写了这个小脚本:
while read p; do
var1=`echo "$p" | awk -F',' '{print $1}'`
var2=`echo "$p" | awk -F',' '{print $2}'`
echo "$var1" "AND" "$var2"
sed -i -e 's/$var1/$var2/g' test.txt
done <fromto.txt
输出看起来不错(x和y),但由于某种原因,它不会用第二列($ var2)替换第一列($ var1)。
的test.txt:
"TRAVEL"
输出:
"TRAVEL" AND "TRAVEL_CHANNEL"
sed -i -e 's/"TRAVEL"/"TRAVEL_CHANNEL"/g' test.txt
"TRAVEL HD" AND "TRAVEL_HD_CHANNEL"
sed -i -e 's/"TRAVEL HD"/"TRAVEL_HD_CHANNEL"/g' test.txt
"FROM" AND "TO"
sed -i -e 's/"FROM"/"TO"/g' test.txt
$ cat test.txt
"TRAVEL"
答案 0 :(得分:1)
输入:
➜ cat fromto
TRAVEL TRAVEL_CHANNEL
TRAVELHD TRAVEL_HD
➜ cat inputFile
TRAVEL
TRAVELHD
工作:
➜ awk 'BEGIN{while(getline < "fromto") {from[$1] = $2}} {for (key in from) {gsub(key,from[key])} print}' inputFile > output
并输出:
➜ cat output
TRAVEL_CHANNEL
TRAVEL_CHANNEL_HD
➜
这第一个(BEGIN{}
)将您的输入文件加载到关联数组中:from["TRAVEL"] = "TRAVEL_HD"
,然后相当低效地执行搜索并逐行替换输入文件中的每个数组元素,输出结果,我通过管道连接到一个单独的输出文件。
警告,你会注意到,搜索和替换会相互干扰,第二行输出是第一次替换发生以来的完美示例。您可以尝试以不同方式订购替换件,或使用正则表达式而不是gsub。不过,我不确定awk数组是否保证有一定的顺序。无论如何,有些东西可以帮助你。
第二个警告。有一种方法可以为整个文件做gsub作为你BEGIN的第二步,可能会更快,但我不确定它是什么。
答案 1 :(得分:0)
你不能这样做你必须在脚本中使用变量
可能类似于以下sed命令完全替换
-bash-4.4$ cat > toto.txt
1
2
3
-bash-4.4$ cat > titi.txt
a
b
c
-bash-4.4$ sed 's|^\s*\(\S*\)\s*\(.*\)$|/^\2\\>/s//\1/|' toto.txt | sed -f - titi.txt > toto.txt
-bash-4.4$ cat toto.txt
a
b
c
-bash-4.4$