Я упомянул в комментариях, что вы можете использовать sed
для этого.Попробовав это, я потерял надежду в sed
, так как не мог найти обходных путей для работы в их регулярных выражениях.По-видимому, команда perl
может анализировать регулярные выражения с помощью обходных путей.Если у вас есть команда perl
, вы можете попробовать это
perl -pe 's/ ([a-z])(?= |$)/\1/g' file.txt
или
cat file.txt | perl -pe 's/ ([a-z])(?= |$)/\1/g'
Что в мире означает этот забор?
Параметр perl
-e
указывает команде perl
принять сценарий (это чудовищное регулярное выражение, которое вы видите сразу после него), и -p
будет зацикливать сценарий вокруг файла.(Я не эксперт по Perl, поэтому мне нужно, чтобы кто-то дважды проверил это, я только посмотрел на perl -h
для помощи.)
Теперь регулярное выражение.
s/<match>/<replace>/g
следует *Синтаксис 1024 *.Это будет s
earch g
в общем для <match>
и заменит его на <replace>
.
Здесь совпадение было ([a-z])(?= |$)
, что говорит perl
сопоставлять места с пробеламиза ним следует строчная буква (([a-z])
, где [a-z]
обозначает набор символов для сопоставления, а ()
обозначает группу захвата, используемую в разделе <replace>
).
И , чтобы убедиться, что то, что следует, является либо пробелом, либо концом строки ((?= |$)
), это [позитивный] взгляд в будущее, о котором я говорил ранее.Вертикальная черта подразумевает «или».Таким образом, смотритель будет искать пробел (
) "или" конец строки ($
).Предварительный просмотр гарантирует правильное совпадение, не включая пробел / конец в совпадении.
Замена была \1
, которая заменит совпадение с первой группой захвата.В этом случае группа захвата соответствует любой строчной букве.
Почему это регулярное выражение работает
Если вы посмотрите на первую строку вашего текстового файла:
Some word here: T h e Q u i c k B r o w n F o x J u m p s O v e r T h e L a z y D o g
Мы хотим сопоставлять только строчные буквы , после которых есть пробел, т. Е. a-z
.Если мы только соответствуем a-z
, это будет включать Some
, word
и here
.Таким образом, мы сопоставляем строчные буквы с пробелами спереди и сзади.Мы удаляем первый пробел, сопоставляя его, только заменяя букву, удаляя пробел.
Ограничения этого регулярного выражения
Если в вашем файле было
Lol a word here: T h e Q u i c k B r o w n F o x J u m p s O v e r T h e L a z y D o g
, тогдаВывод будет включать:
Lola word here: The Quick Brown Fox Jumps Over The Lazy Dog
не так точно, как ответ gboffi в том смысле, что он соответствует после двоеточия, но все же регулярные выражения - короткий взлом ¯ \ _ (/) _ / ¯.
Дополнительная литература: Ссылка: Что означает это регулярное выражение?