ファイルディレクトリを繰り返して正規表現と一致させ、適切な文字を置き換えたいと思います。
#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/
文字列の中央にある文字を削除するためにのみ使用することを除いて、まったく同じように機能します。
答え2
これは私にとって効果的なようです...
$ ls
#somefile.txt %somefile.txt >somefile.txt
$ for f in *; do j=`echo $f | sed -e's/[\%\#\>]//g'`; echo "$f -- $j"; done
#somefile.txt -- somefile.txt
%somefile.txt -- somefile.txt
>somefile.txt -- somefile.txt