この質問がリストされている可能性がありますが、正しい答えが見つかりませんでした。
ファイルを参照し、パターンを一致させ、他のものに置き換えようとします。ところが、他の場所にもパターンが現れますが、長さが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
退屈になります。
これの利点は、最初のフィールドまたは最後のフィールドが両端に分割されていなくても、そのフィールド|
で置換が発生することです。