从文件

时间:2017-12-29 21:01:12

标签: linux bash awk sed

我需要帮助替换文件中的字符串,其中“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"

2 个答案:

答案 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$