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"。我甚至不確定是否\n適用於 IFS 定義。使用 IFS=$'\n' 代替或

IFS="
"

編輯

$'\n'形式並不能解決問題。 「空白行」形式使內容正確顯示,但結果不再以列表形式呈現(每行一個)。我保留「空白行」形式,因為它的結果大致就是我需要的。

/編輯

如果你在行之前恢復它,設定 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='
'

第二個問題是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

感謝吉爾斯,最終的腳本可以運行:

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

驚人的 !

相關內容