grepの使用に問題があります。返される結果は「n-empty」です。つまり、「n」文字がないことを意味します...
以下はスクリプトの例です。
OLDIFS=$IFS
IFS="\\n"
i=$(grep -ril $1 *)
echo $i
IFS=$OLDIFS
IFS='\n'
試してみましたが、IFS="\n"
結果は正しいパスを示していますただIFSを取り除くと...
私はループで結果を使用しますfor theFile in $i; do......done
。結果は正しい方法で使用され、theFile
正しく表示されます。。
$i
唯一の問題は、戦略データである正しいコンソール/ファイル出力がないことです。
コンソールに表示される内容と作成されたファイル(例):
LecteurSy dicatio _sy dic/fiche_93.xml
表示して作成する内容(例):
LecteurSyndication_syndic/fiche_93.xml
どんなアイデアがありますか?
編集:自宅でプレイするためのフルスクリプト;)
#!/bin/bash
monTerminal=$(tty) ; monTerminal=${monTerminal:9}
fichier="/home/importts/tmpCmdOpenFirst$monTerminal.xml"
PWD="`pwd`"
echo "== Recherche dans les fiches ==" > "$fichier"
echo "Recherche : $1" >> "$fichier"
echo "Dans : $PWD" >> "$fichier"
OLDIFS=$IFS
IFS="\\n"
i=$(grep -ril $1 *)
echo $i
echo "== Liste des fichiers trouves ==" >> "$fichier"
echo $i >> "$fichier"
IFS=$OLDIFS
#while read uneFiche
for uneFiche in $i;
do
echo "================================" >> "$fichier"
echo "== $uneFiche" >> "$fichier"
echo "================================" >> "$fichier"
echo "" >> "$fichier"
xmlindent "$uneFiche" >> "$fichier"
done < /home/robert/tmpCmdOpenFirst_liste.txt
nano "$fichier"
#rm $fichier
答え1
問題の説明に従うのは簡単ではありません。唯一の有用な情報は失われ、これは出力grep -ril $1 *
(またはむしろ出力サンプル)と問題の説明です。問題はいくつかのパスの空白だと思います。
編集:要求されたサンプルを準備します。
スペースは実際には「n」文字です...
1_LecteurSy dicatio _sy dic/fiche_174.xml
2_Tra sformatio XSL_tif/fiche_174.xml
3_CorrigerTIF_cor/fiche_174.xml
4_Tra sformatio XSL_ge /fiche_174.xml
/編集する
IFS="\\n"
簡単に確認できるので、明らかに間違っていますecho "\\n"
。これが\n
IFS定義に適用されるかどうかはわかりません。代わりに IFS=$'\n' を使用するか、
IFS="
"
編集する
$ '\ n'形式は問題を解決しません。 「空白行」形式では、内容は正しく表示されますが、結果はリスト(1行に1つずつ)として表示されなくなります。結果がおおよその必要なので、「空行」形式を維持しました。
/編集する
IFSを設定する前に復元すると、私には意味がありませんfor uneFiche in $i
。これはラインに影響を与え、echo $i >> "$fichier"
参照によってはるかに簡単になりますi="$(grep -ril $1 *)"
。echo "$i" >> "$fichier"
編集する
i="$(grep -ril $1 *)"
何も動作しないようです。
/編集する
空白とトークン化に問題がある場合は、次のパイプを使用する方が簡単です。
grep -ril --null -- "$1" * | xargs -0 /my/script.sh
そして/my/script.sh
存在
#!/bin/bash
fichier="/home/importts/tmpCmdOpenFirst$monTerminal.xml"
for uneFiche in "$@"; do
echo "================================"
echo "== $uneFiche"
echo "================================"
echo
xmlindent "$uneFiche"
done >> "$fichier"
答え2
IFS
まず改行ではなくに設定しました\n
。 Bashでは、次のように$'…'
バックスラッシュシーケンスを制御文字として解釈できます。
IFS=$'\n'
あるいは、リテラルの改行を使用することもできます。
IFS='
'
2番目の質問は、IFS
変数を拡張する際に重要です。したがって、拡張時に設定する必要があり$i
、実際にはいつに設定しても構いませんi
。
i=$(grep -ril -e "$1" -- *)
set -f; OLDIFS="$IFS"; IFS='
'
for uneFiche in $i; do
set +f; IFS="$OLDIFS"
…
done
set +f; IFS="$OLDIFS"
また、に渡されたパターンのように分割しないときは、変数を引用することを忘れないでくださいgrep
。パターンがで始まる場合は、オプションと一緒に渡します-
。最初のファイル名が.で始まる場合でも、ファイル名の前に続ける必要があります。また、ファイル名にワイルドカードが含まれている場合は、引用符で囲まれていない変数拡張の前にワイルドカードをオフにしてください。grep
-e
--
-
set -f
より簡単なアプローチは、grep
ループ内で各ファイルを呼び出すことです。別の利点は、改行文字を含むファイル名でスクリプトが中断されないことです。
for uneFiche in *; do
if grep -qri -e "$1" -- "$uneFiche"; then
…
fi
done
答え3
Gilesのおかげで、最終スクリプトが機能します。
#!/bin/bash
# use a buffer file per terminal, permits multiple users
monTerminal=$(tty) ; monTerminal=${monTerminal:9}
fichier="........./tmpCmdFiche$monTerminal.xml"
PWD="`pwd`"
echo "== Recherche dans les fiches ==" > "$fichier"
echo "Recherche : $1" >> "$fichier"
echo "Dans : $PWD" >> "$fichier"
i=$(grep -ril -e "$1" -- *)
set -f
OLDIFS="$IFS"
IFS='
'
echo "== Liste des fichiers trouves ==" >> "$fichier"
echo "$i" >> "$fichier"
for uneFiche in $i; do
set +f; IFS="$OLDIFS"
echo "================================" >> "$fichier"
echo "== $uneFiche" >> "$fichier"
echo "================================" >> "$fichier"
echo "" >> "$fichier"
xmlindent "$uneFiche" >> "$fichier"
done < ............/tmpCmdOpenFirst_liste.txt
set +f
IFS="$OLDIFS"
以下はコマンド結果の例ですcmdFiche somethingsosearch
。
== Recherche dans les fiches ==
Recherche : somethingsosearch
Dans : ............/XMLs/.........
== Liste des fichiers trouves ==
1_ImportationZip_zip/file2.xml
2_ImportationSuppSyndication_syndic/file19.xml
3_ModifierOrdreImages_ordre/fiche_44.xml
4_CorrigerPeriodesViaSyndication_periodes/fiche_44.xml
5_TransformationXSL_tif/fiche_44.xml
6_CorrigerRaisonSocialeViaSyndic_raisonsociale/fiche_44.xml
7_ExclureImportNoeuds_avantv2/fiche_44.xml
================================
== 1_ImportationZip_zip/file2.xml
================================
<?xml version="1.0" encoding="utf-8"?>
<tif:OI xmlns:tif="http://www.tourinfrance.net/Tourinfrance3/" xmlns:xsi="http://www.w$
<!--Granule DublinCore-->
<tif:DublinCore>
素晴らしい!