forループで正規表現を使用する

forループで正規表現を使用する

ファイルディレクトリを繰り返して正規表現と一致させ、適切な文字を置き換えたいと思います。

#somefile.txt
%somefile.txt
>somefile.txt

# arr=(\% \> \#) ;for f in *; do echo -- "$f" "${f//${arr[@]}/}"; done

エコーする必要があります:

#somefile.txt -- somefile.txt
%somefile.txt -- somefile.txt
>somefile.txt -- somefile.txt

代わりに、私は次のようになります。

#somefile.txt -- #somefile.txt
%somefile.txt -- %somefile.txt
>somefile.txt -- >somefile.txt

これはどんな変化にもつながりません。 nada、ジルチ。

arr(\%)単一文字を使用すると配列が機能するため、目的全体が失われます。

#somefile.txt -- #somefile.txt
%somefile.txt -- somefile.txt
>somefile.txt -- >somefile.txt

ベストアンサー1

ここで重要な問題は、${PARAMETER/PATTERN/STRING}拡張がPATTERN配列を許可しないことですPARAMETER。したがって、${arr[@]}拡張は"% > #"

いくつかのファイルを追加すると、次の効果が表示されます。

# touch "% > #somefile.txt"
# touch "%>#somefile.txt"

コマンドの結果は次のとおりです。

#somefile.txt -- #somefile.txt
%somefile.txt -- %somefile.txt
>somefile.txt -- >somefile.txt
%>#somefile.txt -- %>#somefile.txt
% > #somefile.txt -- somefile.txt

最後の行は、何が起こっているのかを正確に示すことを願っています。

他の人はパイピング$fを通してsedそこで魔法を実行することを提案しました。これはより複雑な変換を可能にするので、良いオプションになりますが、先行文字だけを削除したいと仮定してbashを使用してください。${PARAMETER#WORD} パラメータ拡張十分です:

# gpat=" ;for f in *; do echo -- "$f" "${f#$gpat}"; done

私自身の場合、この行の結果は次のとおりです。

>somefile.txt -- somefile.txt
#somefile.txt -- somefile.txt
%somefile.txt -- somefile.txt
%>#somefile.txt -- >#somefile.txt
% > #somefile.txt --  > #somefile.txt

$gpat私はこのパターンを「a」と呼びます。Bash ワイルドカードパターン。それいいえ正規表現。

欲は${PAR#WORD}なく、できるだけ短いパターンと一致します。${PAR##WORD}可能な限り長いパターンと一致します。ただし、の場合はgpat="[%>#]"1文字だけが一致します。

# gpat="[%>#]" ;for f in *; do echo "$f" -- "${f##$gpat}"; done

%somefile.txt -- somefile.txt
>somefile.txt -- somefile.txt
#somefile.txt -- somefile.txt
%>#somefile.txt -- >#somefile.txt
% > #somefile.txt --  > #somefile.txt

extglobシェルオプションを設定すると(確認shopt extglob、設定shopt -s extglob、設定解除shopt -u extglob- 適切なオプションがあれば設定されている可能性が高いbashrc)、拡張グロービングモードを使用できます。

# gpat="+([%>#])" ;for f in *; do echo "$f" -- "${f##${gpat}}"; done

%somefile.txt -- somefile.txt
>somefile.txt -- somefile.txt
#somefile.txt -- somefile.txt
%>#somefile.txt -- somefile.txt
% > #somefile.txt --  > #somefile.txt

ただし、上記のすべての例では、%の後のスペースがパターンによってキャプチャされないために発生することに注意する価値があります"% > #somefile.txt"" > #somefile.txt"

もちろん${PARAMETER/PATTERN/STRING}(そして//同様の)もワイルドカードパターンを受け入れますが、この単語を入力したときにこれを(文字通り)実現し、それを反映するために上記を見直すのはあまりにも怠惰です。とにかく、PAR/PAT/文字列の中央にある文字を削除するためにのみ使用することを除いて、まったく同じように機能します。

おすすめ記事