grep と IFS の非常に奇妙な動作

grep と IFS の非常に奇妙な動作

grep の使用に問題があります。返される結果は「n 空」、つまり「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"。 がIFS定義で機能するかどうかさえわかりません\n。 代わりに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

まず、 を改行ではなく に設定しています。bash では、 を使用してIFSバックスラッシュ シーケンスを制御文字として解釈することができます。\n$'…'

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

Gilles のおかげで、動作する最終的なスクリプトができました。

#!/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>

素晴らしい !

関連情報