grepとIFSは非常に奇妙に動作します。

grepとIFSは非常に奇妙に動作します。

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"。これが\nIFS定義に適用されるかどうかはわかりません。代わりに 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>

素晴らしい!

関連情報