从文件替换文件中的字符串[重复]

问题描述 投票:1回答:2

这个问题在这里已有答案:

我需要帮助替换文件中的字符串,其中“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"
linux bash awk sed
2个回答
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的第二步,可能会更快,但我不确定它是什么。


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$ 
© www.soinside.com 2019 - 2024. All rights reserved.