我有一堆文件需要使用自定义词典进行翻译。每个文件都包含一行,指示要使用的字典。这是一个例子:
*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
,然后继续。
答案 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