特定の文字が表示されるまですべての文字を置き換えます。

特定の文字が表示されるまですべての文字を置き換えます。

例えば、以下は md5sum コマンドの出力です。

35c9581c469c366e286be708a9d9f939  input.txt

これは私が実行しているコマンドラインです。

md5sum input.txt | sed -f script.sed

md5sumの出力は次のようになります。

35c9xxxxxxxxxxxxxxxxxxxxxxxxxxxx  input.txt

現在、私の.sedスクリプトには、最初の4文字を除くすべての内容を編集する次の内容が含まれています。

s/./x/5g

スペース「」が見つかったら、この操作を停止する必要があります 。どんなアイデアがありますか?

ベストアンサー1

if(md5sum) hash;これはこれを行います(中括弧拡張をサポートするシェルで)。

sed -e's/./x/'{5..32} infile

else 最初の文字スペースが表示されるまで、すべての文字長に対して以下を行います。

sed一般的な解決策として、およびを使用してください。

sed -E ':a s/^(.{4}x{0,})[^x ]/\1x/;ta' infile
  • :ased私たちの名前付きタグa
  • s/以下の一致を交換してください。
    • ^行アンカーポイントの始まりです。
    • (グループ予選開始
      • .単一文字の一致
      • .{4}4文字(または....)のみが一致し、次の文字と一致します。
      • x{0,}0文字以上x(またはx*
    • )グループマッチが終了し、リバース参照は\1
    • [^x ]文字列を除くすべての文字と一致しますx (文字クラスでその^文字が開かれた直後に最初の文字の場合は、否定一致が行われます。)[[^...]
  • /以下で
    • \1は上記の一致部分の逆参照である(...)ため、最初の部分は再び所定の位置にありますが、x後で追加のコンテンツが追加されます。
    • そして一つ、上で私たちは別れ予選で得点できxなかったという事実を覚えていますか?今一つずつ入れ替えるキャラクターたちです。[^x ](...)x
  • /交換終了
  • ;新しいコマンドの開始
  • taa交換が成功するとラベルに移動します。それ以外の場合は、すべての文字を次のように置き換えました。これは、置き換えてコマンドをx終了する文字が残っていないことを意味します。sed

おすすめ記事