Я бы использовал 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
Для обработки нескольких файлов вы можете создать сценарий bash:
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
person
Ivan Georgiev
schedule
04.01.2017