Я бы использовал sed
или awk
. Я покажу вам, как это сделать с awk
, потому что он более независим от платформы. Если у вас нет awk
, вы можете скачать двоичный файл mawk с http://invisible-island.net/mawk/mawk.html.
Идея следующая: сообщите awk
, что ваш разделитель строк - это что-то другое, а не возврат каретки или линия. Я буду использовать запятую.
Чем использовать регулярное выражение, чтобы заменить строку, которая вам не нравится.
Вот тестовый файл, который я создал. Сохранить как test.txt
:
1,Line before ...
2,Broken line ... 14 MakeUp Road
Hull
HU99 9HU
3,Line after
Позвони awk
следующим образом:
awk 'BEGIN { RS = ","; ORS=""; s=""; } $0 != "" { gsub(/MakeUp Road[\n\r]+Hull[\n\r]+HU99 9HU/, "MakeUp Road Hull HU99 9HU"); print s $0; s="," }' test.txt
я предлагаю вам сохранить код AWK в файл с именем cleanup.awk
. Вот лучший форматированный код с пояснениями.
BEGIN {
# This block is executed at the beginning of the file
RS = ","; # Tell awk our records are separated by comma
ORS=""; # Tell awk not to use record separator in the output
s=""; # We will print this as record separator in the output
}
{
# This block is executed for each line.
# Remember, our "lines" are separated by commas.
# For each line, use a regular expression to replace the bad text.
gsub(/MakeUp Road[\n\r]+Hull[\n\r]+HU99 9HU/, "MakeUp Road Hull HU99 9HU");
# Print the replaced text - $0 variable represents the line text.
print s $0; s=","
}
Использование файла AWK, вы можете выполнить замену следующим образом:
awk -f cleanup.awk test.txt
Чтобы обработать несколько файлов, вы можете создать Баш скрипт:
for f in `ls *.txt`; do
# Execute the cleanup.awk program for each file.
# Save the cleaned output to a file in a directory ../clean
awk -f cleanup.awk $f > ../clean/$f
done