LINUX.ORG.RU

Как исключить пробелы из цикла?

 


0

2

есть такие файлы:

grep -rl USA
105 - Las Cruces.txt
85 - Eureka.txt
84 - San Francisco.txt
102 - Tucson.txt
88 - Mariposa.txt
90 - San Diego.txt
103 - Santa Fe.txt
86 - Sacramento.txt
87 - Monterey.txt
98 - Loa.txt
89 - Los Angeles.txt
97 - Salt Lake City.txt
100 - Phoenix.txt
94 - Carson City.txt
101 - Flagstaff.txt
95 - Elko.txt
96 - Las Vegas.txt
104 - Albuquerque.txt

пытаюсь выполнить

for i in $(grep -rl USA); do sed -i 's/MEX/USA/g' "$i"; done
sed: can't read 105: No such file or directory
sed: can't read -: No such file or directory
sed: can't read Las: No such file or directory
sed: can't read Cruces.txt: No such file or directory
sed: can't read 85: No such file or directory
sed: can't read -: No such file or directory
sed: can't read Eureka.txt: No such file or directory
sed: can't read 84: No such file or directory
sed: can't read -: No such file or directory
sed: can't read San: No such file or directory
sed: can't read Francisco.txt: No such file or directory
sed: can't read 102: No such file or directory
sed: can't read -: No such file or directory
sed: can't read Tucson.txt: No such file or directory
sed: can't read 88: No such file or directory
sed: can't read -: No such file or directory
sed: can't read Mariposa.txt: No such file or directory
sed: can't read 90: No such file or directory
sed: can't read -: No such file or directory
sed: can't read San: No such file or directory
sed: can't read Diego.txt: No such file or directory

Зачем он пробелы в цикл закидывает?

cat та же самая проблема и кавычки не помогают.

steemandlinux ★★★★★ ()

А доперло, блин час продолбался, как написал дошло. Он пробелы при формировании цикла как спецсимволы воспринимает. Кавычки для грепа тоже нужны.

steemandlinux ★★★★★ ()
Ответ на: комментарий от steemandlinux

Хорошо, что у тебя работает. Могу еще такой вариант предложить:

_IFS="$IFS"
IFS=$'\n'
for i in $(grep -rl USA); do sed -i 's/MEX/USA/g' "$i"; done
IFS="$_IFS"

KennyMinigun ★★★★★ ()
Ответ на: Или так от intelfx

Или так (если тело цикла интерактивное, т. е. stdin должен быть с терминала)

readarray -t files < <(grep -rl USA)
for file in "${files[@]}"; do
    sed -i 's/MEX/USA/g' "$file"
done
intelfx ★★★★★ ()

Или так (опять же, если тело цикла интерактивное, но при этом файлов много и загонять в массив неоптимально)

while read -u 9 file; do
    sed -i 's/MEX/USA/g' "$file"
done 9< <(grep -rl USA)
intelfx ★★★★★ ()
Последнее исправление: intelfx (всего исправлений: 2)

цикл не нужен, sed может сразу несколько файлов править

zolden ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.