Не могли бы вы попробовать следующее (протестировано с предоставленным образцом и с GNU awk
).
awk '{gsub(/:/," ");gsub(/\. +/,".");gsub(/ +/," ")} 1' Input_file
Объяснение: Использование здесь gsub
для глобальной замены. 1-й глобально замещающий двоеточие пробелом, затем глобально заменяющий DOT пробелом. Наконец, глобально заменяя пространство (ы) одним пробелом. Затем, упомянув 1
, дайте awk
знать, чтобы напечатать отредактированную / нередактированную строку.
awk
работает над методом регулярного выражения / условием, а затем действием. Если какое-либо регулярное выражение / условие имеет значение ИСТИНА, то будет выполнено действие, упомянутое рядом с ним. В этом случае я не упомянул никаких действий, поэтому по умолчанию будет напечатана текущая строка.
О gsub
от человека: awk
:
gsub(r, s [, t]) For each substring matching the regular expression r in the string t, substitute the string s, and return the number of substitutions. If t is not supplied, use $0. An & in the
replacement text is replaced with the text that was actually matched. Use \& to get a literal &. (This must be typed as "\\&"; see GAWK: Effective AWK Programming for a fuller dis-
cussion of the rules for &’s and backslashes in the replacement text of sub(), gsub(), and gensub().)
EDIT1: Добавление решения sed
сейчас (проверено в GNU sed
).
sed -E 's/:/ /g;s/\. +/\./g;s/ +/ /g' Input_file