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
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>
놀라운!