grep 和 IFS 的行为非常奇怪

grep 和 IFS 的行为非常奇怪

我在使用 grep 时遇到问题,返回的结果是“n-empty”,我的意思是没有“n”字符......

这是脚本示例:

OLDIFS=$IFS
IFS="\\n"

i=$(grep -ril $1 *)

echo $i

IFS=$OLDIFS

我尝试使用IFS='\n'andIFS="\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>

惊人的 !

相关内容