Очень странное поведение grep и IFS

Очень странное поведение grep и IFS

У меня возникли проблемы с использованием 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>

Потрясающий !

Связанный контент