使用多个词典更改文本文件中的单词

时间:2017-01-15 13:55:41

标签: bash unix dictionary sed

我有一堆文件需要使用自定义词典进行翻译。每个文件都包含一行,指示要使用的字典。这是一个例子:

*A:
!
=1
*>A_intro
1r
=2
1r
=3
1r
=4
1r
=5
2A:maj
*-

在上面的文件中,*A:表示要使用dictA

我可以使用以下语法轻松翻译此部分:

sed -f dictA < myfile

我的问题是某些文件需要在文本中途更改字典。例如:

*B:
1B:maj
2E:maj/5
2B:maj
2E:maj/5
*C:
2F:maj/5
2C:maj
2F:maj/5
2C:maj
*-

我想编写一个脚本来自动化翻译过程。使用此示例,我希望脚本读取第一行,选择dictB,使用dictB翻译每一行,直到它读取*C:,选择dictC,然后继续。

2 个答案:

答案 0 :(得分:0)

谢谢@Cyrus。这很有用。这就是我最终做的事情。

#!/bin/sh
key="sedDictNull.txt"
while read -r line || [ -n "$line" ]  ## Makes sure that the last line is read. See http://stackoverflow.com/questions/12916352/shell-script-read-missing-last-line
do
        if [[ $line =~ ^\*[Aa]:$ ]]
        then
        key="sedDictA.txt"
        elif [[ $line =~ ^\*[Aa]#:$ ]]
        then
        key="sedDictA#.txt"
        fi
        echo "$line" | sed -f $key 
done < $1

答案 1 :(得分:0)

我假设您的&#34;字典&#34;是真正的sed脚本,可以搜索和替换,如下所示:

s/2C/nothing/;
s/2B/something/;

您可以将这些脚本重组为多个部分,如下所示:

/^\*B:/, /^\*[^B]/ {
    s/1B/whatever/;
    s/2B/something/;
}
/^\*C:/, /^\*[^C]/ {
    s/2C/nothing/;
    s/2B/something/;
}

当然,你可以动态地做到这一点:

for dict in B C
    do echo "/^\\*$dict:/, /^\\*[^$dict]/ {"
    cat dict.$dict
    echo "}"
done | sed -f- dict.in