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를 복원하면 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>
엄청난 !