根据textfile中的表替换string中的子串

时间:2016-01-09 21:57:07

标签: string bash replace

操作系统:Linux Mint,Bash:GNU bash,版本4.3.11

我有一个这样的字符串:

(abc):seq1,seq2,whatever:(123seq3)

我想根据以下表格替换seq1 ... seq3

seq1 name1
seq2 name2
seq3 name3

该表位于文本文件中,表中的分隔符实际上是制表符,而不是示例中的空格。要替换的子串(seq1等)只能通过其名称来识别。字符串中没有分隔符。

2 个答案:

答案 0 :(得分:2)

我建议在这里使用awk。假设您的字符串存储在变量$string中并且替换文件位于文件table中,您可以执行以下操作。

awk -v input="$string" '{ gsub($1, $2, input) } END { print input }' table

这将使用第二个字段的内容替换每行第一个字段中出现的任何字符串。它假定文件中的字符串不包含任何可被解释为正则表达式元字符的字符,例如*&

答案 1 :(得分:1)

假设您的替换表存储在文件table中,您可以使用

#!/bin/bash

string="$1"

while read from to; do
    string="${string//$from/$to}"
done < "$2"

echo "$string"

如果它存储在文件script中,您可以按如下方式使用它:

./script '(abc):seq1,seq2,whatever:(123seq3)' table

它会返回

(abc):name1,name2,whatever:(123name3)

脚本遍历table文件,对于每个条目,使用参数扩展替换相应的字符串。