如何删除字符串中的特定字符,但前提是在Linux中该行中没有数字时


8

我已经为这个看似简单的问题感到困惑。

这是我需要编辑的文件的示例输出:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

我需要删除“乔治华盛顿”和“日内瓦公约”之间的空格,而不是“ 123,281,029 USD”或“ 342,019,929 EUR”之间的空格。

本质上,我的目标是仅在一行中没有数字的情况下才删除一行中单词之间的空格。

我试图通过编辑文件grep -v [0-9] $file | sed 's/ //',但是唯一可行的方法是输出到另一个文件,但这意味着从旧文件到新文件都排除了所有带数字的行,这不是我所需要的。

我已经用grep尝试了一些非常荒谬的循环,sed但是似乎没有什么能正常工作。

同样,这是文件的示例输出:

$cat file
George Washington
Geneva Convention
123,281,029 USD
342,019,929 EUR

这是我想要的输出:

$cat file
GeorgeWashington
GenevaConvention
123,281,029 USD
342,019,929 EUR

Answers:


15

使用sed

sed '/[0-9]/!s/ //g' filename

这将删除所有不包含数字的行上的空格。

使用awk

awk '!/[0-9]/{gsub(" ", "", $0)};1' filename

要仅删除前两个单词之间的空格(此处将GNU sed用于-r,请-E在BSD上改为使用):

sed -r '/[0-9]/!s/([^ ]+) ([^ ]+)/\1\2/' filename

完善!这正是我想要的!在“ / [0-9] /!s /”部分的任何地方都找不到语法。非常感谢你。
user62129 2014年

@ user62129-如果此答案解决了您的问题,请花一分钟时间并检查左侧投票数下的复选标记,这将向所有人表示您的问题已解决。
slm


4

对于更通用的方法,仅删除两个字母之间的空格。这样,即使行中有数字,它也可以工作,它只是忽略数字周围的空格:

perl -pe 's/([a-z])\s+([a-z])/$1$2/ig' file

将,例如,转George and Harry 12 EURGerogeandHArry 12 EUR,仍然在你的榜样的情况下正常工作。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.