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' 형식으로는 문제가 해결되지 않습니다. "빈 줄" 형식을 사용하면 내용이 올바르게 표시되지만 결과는 더 이상 목록(한 줄에 하나씩)으로 표시되지 않습니다. 나는 그 결과가 대략 내가 필요로 하는 것이기 때문에 '빈 줄' 형식을 유지합니다.

/편집하다

해당 라인 이전에 IFS를 복원하면 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설정 했습니다. Bash에서는 백슬래시 시퀀스를 제어 문자로 해석하는 데 \n사용할 수 있습니다 .$'…'

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. 패턴이 로 시작하는 경우 옵션 으로 에 -전달하세요 . 또한 첫 번째 파일 이름이 . 또한 파일 이름에 glob 문자가 포함된 경우 변수 확장을 따옴표로 묶지 않은 상태로 두기 전에 globbing을 끄십시오.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>

엄청난 !

관련 정보