1つ以上の文字の前にある一部の文字(すべてではない)を削除するには?

1つ以上の文字の前にある一部の文字(すべてではない)を削除するには?

文字の前にあるすべての項目を削除するには(「(」))'s/.*(//g'-(

いくつか試してみましたが、成功しませんでした。例は次のとおりです。

sed 's/ *(/(/g'

ただし、これは古いスペースのみを削除し、他のスペースは削除しません。これはコードを読むときに意味があります(空白と間のすべての項目は削除されますが、(ここで要求する前に何かを試す必要があります)。だから、次のことを試しました。どちらも機能しません)

sed 's/* (/(/g'

しかし、今回はなぜできないのかわかりません。スペースは非常に特殊な文字だからだと思い、代わりに(-およびs/*- (/(/g's/*-* (/(/g'を試してみましたが、やはり動作しませんでした。

入力する:

081 379 62 49 (Hems)
081-379-62-49 (Hems) 

希望の出力:

0813796249 (Hems)

ベストアンサー1

前のスペースとダッシュの両方を削除しますか(?その後、スペースとダッシュを含む文字クラスまたは「括弧式」を使用する必要があります。[- ]

sed -e 's/[- ]*(/(/g'

詳細を確認してman 7 regex検索してくださいbracket expression

上記の入力(081 379 62 49 (Hems)または081-379-62-49 (Hems))を使用して、以下を実行できますawk

awk -F'(' 'BEGIN {OFS=" ("} ; {gsub(/[- ]/,"",$1) ; print}'

これはawkにフィールド区切り文字を使用し、その(機能gsub()を使用して最初のフィールド(電話番号)からスペースとダッシュを削除するように指示します。 OFS(出力フィールド区切り文字)は、正しい出力を生成するために((スペースと)に設定されています。(

例えば

echo -e "081 379 62 49 (Hems)\n081-379-62-49 (Hems)" | 
    awk -F'(' 'BEGIN {OFS=" ("} ; {gsub(/[- ]/,"",$1) ; print}'
0813796249 (Hems)
0813796249 (Hems)

ただし、(...)電話番号の後にスペースやダッシュがない場合(内部など)、sedを使用してこれを行うこともできます。

echo -e "081 379 62 49 (Hems)\n081-379-62-49 (Hems)" | 
    sed -e 's/[ -]//g ; s/(/ (/'

これにより、入力行からすべてのスペースとダッシュが削除されます(。括弧内に複数の単語(説明/名前フィールド?)があると、出力は本当に見苦しくなります。

スペースを保存するために電話番号をコピーしてそこから変更してから出力ラインに再挿入するなど、sedでこれを正しく実行する恐ろしいほど複雑な方法があるかもしれませんが、awkを使用して実行する方が簡単です。

おすすめ記事