文字列内の特定の文字を削除する方法はLinuxでその行に数字がない場合のみ


8

私はこの一見修正が簡単な問題に困惑してきました...まあ、しばらくの間。

編集する必要があるファイルからの出力例を次に示します。

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

「George Washington」と「Geneva Convention」の間のスペースを削除する必要がありますが、「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

回答:


15

使用sed

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

これにより、数字を含まないすべての行のスペースが削除されます。

使用awk

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

最初の2つの単語の間のスペースのみを削除するには(ここではGNU sedfor -rを使用し、-E代わりにBSD で使用します):

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

パーフェクト!これがまさに私が探していたものです!"/ [0-9] /!s /"部分の構文が見つかりませんでした。どうもありがとうございました。
user62129 2014年

@ user62129-この回答で問題が解決した場合、少し時間を取って、左側の投票数の下にあるチェックマークをチェックしてください。これは、問題が解決されたことを全員に示します。
slm


4

より一般的なアプローチでは、2つの文字の間にあるスペースのみを削除します。これにより、行に数字が含まれていても機能し、数字の周りのスペースは無視されます。

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

その意志は、例えば、オンGeorge and Harry 12 EURGerogeandHArry 12 EURし、まだあなたの例では、例のために正しく動作します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.