我在使用 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>
驚人的 !