2017-02-06 15 views
0

Пусть у меня есть следующий файлНайти подряд через пробел отдельных символов в каждой строке в Баше

Y M C A 
cambridge m a 
d m v office 
t mobile 

и хотим, чтобы преобразовать его в

YMCA 
cambridge ma 
dmv office 
t mobile 

, который должен обнаружить все последовательные одиночные символы следует единым пространством разной длины (больше двух). Например, элемент «d m v office», мы должны обнаружить 'd m v' и преобразовать его в 'dmv', но не оставим 't mobile store' неповрежденным (всего один символ).
Возможно ли это сделать в bash или мне нужно использовать программу, такую ​​как python?

+1

Не должно ли оно «больше или равно * двум»? В противном случае 'm a' должен остаться' m a'. –

ответ

5

Perl один вкладыш:

echo 'Y M C A' | perl -ple's/\b\w\K\s(?=\w\b)//g' 
==> YMCA 

echo 't mobile' | perl -ple's/\b\w\K\s(?=\w\b)//g' 
==> t mobile 

Это заменяет пространство, когда в окружении одного символа слова. Вы можете заменить \w на [a-zA-Z], если это более удобно для вас.

+0

Существует также '\ pL' aka' \ p {Letter} ', в отличие от' \ w', это не сжимает '1 2 3 4' – ikegami

1

С любым AWK в любой оболочке на любой системе UNIX:

$ awk '{out=$1; for (i=2;i<=NF;i++) {out = out (length($(i-1)$i)==2 ? "" : OFS) $i} print out}' file 
YMCA 
cambridge ma 
dmv office 
t mobile 
2

Это SED один лайнер работает на данном примере:

sed -r 's/ (\S\S)/_\1/g;s/(\S\S) /\1_/g;s/ //g;s/_/ /g' file 

тест с вашими данными:

kent$ sed -r 's/ (\S\S)/_\1/g;s/(\S\S) /\1_/g;s/ //g;s/_/ /g' f 
YMCA 
cambridge ma 
dmv office 
t mobile 

Я использовал держатель места в приведенной выше строке, _, если в вашем тексте уже есть _, вы можете использовать \x99, в видимой части.

+0

простой и эффективный, приятный – user1848018

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

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