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를 설정하기 전에 복원하면 나에게 의미가 없습니다 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

Giles 덕분에 최종 스크립트가 작동합니다.

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

놀라운!

관련 정보