замена на седь не работает правильно - PullRequest
0 голосов
/ 27 сентября 2018

Я попытался выполнить следующие команды и объяснить мою проблему:

$cat __sphlist__
signals/APASCI/algi0/algi0.sph
signals/APASCI/ancl0.sph
signals/APASCI/anpe0.sph
signals/APASCI/cepe0.sph

, почему не работает следующая команда, и показать содержание сигналов!:

$cat __sphlist__ | while read f; do sed 's/signals/nb-signals/'  $f; done

но то же самое для эхо работает?

$cat __sphlist__ | while read f; do echo  $f; done

Я изменил команду sed, как показано ниже, и она работает, я хотел знать, в чем разница?

$cat __sphlist__ | sed 's/signals/nb-signals/' | while read f; do echo $f ; done

Ответы [ 3 ]

0 голосов
/ 27 сентября 2018

Как работает SED.

SED может работать со всеми строками в файле одна за другой, поэтому вам не нужно кормить SED каждой строкой WHILE.

$cat sphlist | while read f; do sed 's/signals/nb-signals/' $f; done

В приведенном выше примере SED рассматривает файл $ f как файл.Поскольку такого файла нет, вы получаете сообщение об ошибке «Нет такого файла или каталога».

$cat sphlist | while read f; do echo $f; done

Ничего особенного в приведенной выше команде нет, поскольку вы читаете построчно и печатаете их.

$cat sphlist | sed 's/signals/nb-signals/' | while read f; do echo $f ; done

В приведенном выше примере вы передаете результат CAT в SED, который вы можете сделать напрямую, как показано ниже

sed 's/signals/nb-signals/' sphlist 

И затем вы передаете результат SED в WHILE, который печатает строку за строкой.Вышесказанное - только все, что вам нужно.

sed 's/signals/nb-signals/g' sphlist 

Обратите внимание на 'g' в последнем из SED в приведенной выше команде?это для глобальной замены значений в файле.

0 голосов
/ 27 сентября 2018

Во-первых, всю команду можно заменить решением Кент .

Теперь, чтобы ответить на ваш вопрос:

Почему следующая команда неработать, и показать содержание сигналов!

cat __sphlist__ | while read f; do sed 's/signals/nb-signals/'  $f; done

Это не проблема с , но с вашим пониманием .

ожидает получить имя файла в качестве ввода и выполнит все свои операции над этим файлом.Это означает, что если переменная f содержит строку, которая соответствует имени файла (для первой строки равной signals/APASCI/algi0/algi0.sph), выполнит замену этого файла и, следовательно, напечатает его содержимое.Если $f не соответствует файлу, он потерпит неудачу.

Написанная вами команда эквивалентна:

sed 's/signals/nb-signals/' signals/APASCI/algi0/algi0.sph
sed 's/signals/nb-signals/' signals/APASCI/ancl0.sph
sed 's/signals/nb-signals/' signals/APASCI/anpe0.sph
sed 's/signals/nb-signals/' signals/APASCI/cepe0.sph

Мы не знаем, каковы ваши намерения, но похоже,Вы хотели переименовать имя каталога signals в nb-signals.Вот несколько способов исправить ваш сценарий:

  • Используйте echo в конвейере и позвольте прочитать из /dev/stdin

    while read -r f; do echo "$f" | sed 's/signals/nb-signals/'; done < __sphlist__
    
  • Использовать здесь строку в качестве ввода для

    while read -r f; do sed 's/signals/nb-signals/' <<< "$f"; done < __sphlist__   
    
  • Использовать подстановку bash

    while read -r f; do echo "${f/signals/nb-signals}"; done < __sphlist__ 
    
  • Просто используйте

    sed 's/signals/nb-signals/' __sphlist__
    

note: Никогда не используйте cat для зацикливания файла!

0 голосов
/ 27 сентября 2018

вы должны заставить sed работать с файлом sphlist вместо строк в этом файле в качестве входных данных.Итак:

sed 's/signals/nb-&/' sphlist 

должно сделать.

Если вы хотите изменить содержимое файла, добавьте -i (gnu sed)

...