2017-01-15 2 views
0

У меня есть куча файлов, которые нужно перевести с использованием пользовательских словарей. Каждый файл содержит строку, указывающую, какой словарь использовать. Вот пример:Изменение слов в текстовых файлах с использованием нескольких словарей

*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

Предлагаю начать с чего-то вроде этого: 'while IFS = read -r line; делать эхо "делать что-то с $ line"; сделано <файл' – Cyrus

ответ

0

Thanks @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 
0

Я предполагаю, что ваши "словари" действительно 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 

 Смежные вопросы

  • Нет связанных вопросов^_^