GNUパターンは正確な文字数と一致し、置き換えられます。

GNUパターンは正確な文字数と一致し、置き換えられます。

この質問がリストされている可能性がありますが、正しい答えが見つかりませんでした。

ファイルを参照し、パターンを一致させ、他のものに置き換えようとします。ところが、他の場所にもパターンが現れますが、長さが17文字のものだけを変えればいいのです。

例:

コンテンツ:

dlkfhfd|fedfe|dfwe3f347fde|3745978|dlkfhr**|376663781736102|**fedfe|dfwe3f347fde

期待する:

dlkfhfd|fedfe|dfwe3f347fde|3745978|dlkfhr**|37xxxxxxxxxxxxx|**fedfe|dfwe3f347fde

進行状況:式を正規表現パターンと一致させることができます。**\|37[0-9]{13}\|**

ただし、に入れると、sedファイルのすべての内容が置き換えられます。

sed -e s/\|37[0-9]{13}\|/\|37xxxxxxxxxxxxx\|/g

私のsedバージョンは4.2.2です。

ベストアンサー1

正規表現は、基本正規表現と拡張正規表現が混在しています。

拡張正規表現({13}および\|リテラルパイプを使用):

sed -E 's/\|37[0-9]{13}\|/|37xxxxxxxxxxxxx|/g'

またはデフォルトの正規表現(\{13\}および|リテラルパイプを使用):

sed 's/|37[0-9]\{13\}|/|37xxxxxxxxxxxxx|/g'

その後、サンプル文字列は次のように変わります。

dlkfhfd|fedfe|dfwe3f347fde|3745978|dlkfhr**|37xxxxxxxxxxxxx|**fedfe|dfwe3f347fde

|また、その部分は正規表現として解釈されないため、式の代替部分をエスケープする必要はありません。


存在するawk

awk -F '|' -vOFS='|' '
    {
        for (i=1; i<=NF; ++i))
            if (length($i)==15 && match($i,"^37[0-9]"))
                $i="37xxxxxxxxxxxxx"
        print 
     }'

ここで使用できますが、gsub()そうするとソリューションとほぼ同じになり、sed退屈になります。

これの利点は、最初のフィールドまたは最後のフィールドが両端に分割されていなくても、そのフィールド|で置換が発生することです。

おすすめ記事