WedX - журнал о программировании и компьютерных науках

Использование знака доллара в sed как для замены переменной, так и для символа

Я пытаюсь использовать sed для изменения строки в файле с именем convergence.gnu. У меня есть переменная с именем lafila, которая является именем файла.

В настоящее время я могу сделать:

lafila="nGas060.dat"
sed -i "6s/.*/plot \"$lafila\" using 1:2 with l/" convergence.gnu

Это правильно изменяет шестую строку моего файла convergence.gnu на:

plot "nGas062.dat" using 1:2 with l

Однако теперь я хочу включить знак доллара в замененную строку, чтобы вместо этого получить:

plot "nGas062.dat" using ($1/1000):2 with l

Можете ли вы сказать мне, что изменить в моей команде sed? Если я убегаю от знака доллара, он не работает должным образом. Двойные доллары тоже не работают.

20.10.2017

  • не могли бы вы добавить образец ввода и ожидаемый результат? Будет хорошо, если все поймут вопрос. 20.10.2017
  • Экранирование знака доллара с помощью обратной косой черты работает ($ echo "\$PATH" # prints $PATH), поэтому можете ли вы показать нам точную команду, которую вы пробовали, и результат? 20.10.2017
  • Хорошо, я отредактировал, чтобы прояснить, что в sed я хочу сначала напечатать замену переменной, а затем я хочу напечатать знак доллара. 20.10.2017
  • Вы можете использовать команду sed c для замены строки указанным текстом, что позволяет не беспокоиться о / символах в замещающем тексте. 20.10.2017

Ответы:


1

Используйте одинарные кавычки:

sed -i '6s/.*/plot "'$lafila'" using ($1\/1000):2 with l/' convergence.gnu

Одинарные кавычки защищают двойные кавычки, и $ внутри них не интерпретируется. Однако вам нужно сбежать /.

Смотрите также:

20.10.2017
  • Но nGas062.dat — это переменная с именем $lafila. Сначала мне нужно, чтобы sed заменил $lafila, а затем использовал $1/1000. То есть, если переменная $lafila=nGas062.dat, то мне нужен вывод: plot "nGas062.dat" using ($1/1000):2 with l 20.10.2017
  • Обновил ответ. 20.10.2017
  • Отлично. Это дало ожидаемый результат. Спасибо!: sed -i '6s/.*/plot "'$lafilas'" using ($1\/1000):2 with l/' convergence.gnu Результат: plot "nGas060.dat" using ($1/1000):2 with l 20.10.2017

  • 2

    Я полагаю, что ваша проблема на самом деле вызвана косой чертой в ($1/1000), которая конфликтует с косой чертой, используемой для разграничения различных компонентов команды sed. Вам либо нужно избежать косой черты, либо использовать другой символ для разграничения строк sed. Любое из приведенных ниже действий должно работать:

    lafila="nGas060.dat"
    sed -i "6s/.*/plot \"$lafila\" using (\$1\/1000):2 with l/" convergence.gnu
    

    or

    lafila="nGas060.dat"
    sed -i "6s,.*,plot \"$lafila\" using (\$1/1000):2 with l," convergence.gnu
    

    Использование другого символа-разделителя может быть хорошим способом сделать вашу строку sed более аккуратной и избежать синдрома наклоняющейся зубочистки< /а>.

    echo foo | sed "s,foo,/there/are/a/lot/of/slashes/here,"
    

    намного лучше, чем

    echo foo | sed "s/foo/\/there\/are\/a\/lot\/of\/slashes\/here/"
    
    20.10.2017
  • Ни одна из приведенных команд не смогла прочитать переменную lafila. Первый и второй результат: plot "" using ($1/1000):2 with l с пустым пространством, где должна быть переменная lafila 20.10.2017
  • Это просто потому, что я не включил часть, где было определено lafila, так как я не думал, что у вас есть проблемы с этим разделом. Я только что обратился к команде sed, которая, похоже, создавала вам проблемы. Я отредактирую свой ответ. 20.10.2017

  • 3

    Попробуй это:

    lafila="nGas060.dat"
    sed -i "6s@.*@plot \"$lafila\" using (\\\$1/1000):2 with l@" convergence.gnu
    

    Вам нужно только экранировать обратную косую черту и после знака доллара.

    \\ + \$ == \\\$
    
    20.10.2017
    Новые материалы

    Объяснение документов 02: BERT
    BERT представил двухступенчатую структуру обучения: предварительное обучение и тонкая настройка. Во время предварительного обучения модель обучается на неразмеченных данных с помощью..

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..


    Для любых предложений по сайту: [email protected]