在bash

时间:2017-02-06 16:32:28

标签: linux bash perl awk sed

假设我有以下文件

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

并希望将其转换为

YMCA
cambridge ma
dmv office
t mobile

用于检测所有连续的单个字符,后跟不同长度的单个空格(大于2)。例如,项目'dmv office',我们应该检测'dm v'并将其转换为'dmv',但会保留't mobile store'完好无损(只有一个)单个字符) 是否可以在bash中执行此操作,或者我必须使用像python这样的程序来执行此操作?

3 个答案:

答案 0 :(得分:5)

Perl one-liner:

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],如果它对您更方便的话。

答案 1 :(得分:2)

这个sed one-liner适用于给定的例子:

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

答案 2 :(得分:1)

在任何UNIX系统上的任何shell中都有任何awk:

$ 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