У меня возникли проблемы с использованием grep, возвращаемые результаты «n-пустые», то есть без символа «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
Есть идеи ?
EDIT: полный сценарий для игры дома ;)
#!/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 *
(или, скорее, его образец) и объяснение, в чем проблема. Я предполагаю, что проблема в пробелах в некоторых путях.
EDIT: Вот образец, который вы запросили:
Пробелы действительно представляют собой символы «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>
Потрясающий !