Рейтинг:1

Отправка переменных сценария bash в sed

флаг vn

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

У меня есть цикл в моем сценарии, который генерирует определенные переменные с помощью разграничения cut -d, и я хочу использовать эти переменные в качестве входных данных для sed, чтобы изменять файл по-разному на каждой итерации. Мой текущий сценарий:

Мой текущий скрипт выглядит так:

для ввода в $(tail -n 3 filea)
делать
        a="$(echo $input | cut -d "," -f 1)"
        b="$(echo $input | cut -d "," -f 2)"
        c="$(echo $input | cut -d "," -f 3)"

        эхо $а
        эхо $b
        эхо $c

        хвост -n 1 файлb | sed 's,'$a','$c',2'
сделано

С выходом:

К
26
Т
КТТХХХХХХХХХХХХХХХХХХХХХХХХХ
п
27
Е
ККТХХХХХХХХХХХХХХХХХХХХХХХХХ
С
31
п
ККТХХХХХХХХХХХХХХХХХХХХХХХХХ

Где, например, строка в позиции 31 должна быть заменена на S, если это P.

Мой текущий статус заключается в том, что я получаю переменные a и c, правильно переданные в команду sed, и соответствующие строки заменяются, но меняются на sed 's,'$a','$c','$b'' останавливает любую замену, и запрашивается исходная (последняя) строка файла b.

Я знаю, что задать хороший вопрос — это совсем другая тема, но я надеюсь, что кто-нибудь поможет мне понять написанное здесь, чтобы я мог продолжать изучать программирование, поскольку я часто переступаю через подобные ошибки.

hesey avatar
флаг vn
Я насчитал 8 цитат, четное число. Как последняя может быть незакрытой замыкающей кавычкой?
флаг hr
Ой, ты прав - извини
hesey avatar
флаг vn
Определенно слишком много цитат :D Но все равно спасибо за проявленный интерес к помощи!
Рейтинг:1
флаг cn

Примечания:

Данный:

$ кошка файлa
К, 26, Т
П, 27, Э
С, 31, П

$ cat файлb
-------------------------ТЕ---П---

тогда

хвост -n 3 файла | в то время как IFS=, читать -r символ замены позиции; делать
    printf -v регулярное выражение '^(.{%d})%s' $((позиция - 1)) "$символ"
    printf -v repl '\1%s' "$replacement"

    эхо "$ регулярное выражение"
    эхо "$repl"

    хвост -n 1 файлb
    хвост -n 1 файлb | sed -E "s/$regex/$repl/"
сделано

выходы:

^(.{25})Т
\1K
-------------------------ТЕ---П---
-------------------------КЭ---П---
^(.{26})Е
\1P
-------------------------ТЕ---П---
-------------------------ТП---П---
^(.{30})П
\1С
-------------------------ТЕ---П---
-------------------------ТЕ---С---

Но это то, что bash может сделать без sed, используя ${вар:смещение:длина} форма Расширение параметра:

хвост -n 3 файла | в то время как IFS=, читать -r символ замены позиции; делать
    echo "$replacement $position $character"
    строка=$(хвост -n 1 файлb)
    эхо "$ строка"
    if [[ "${line:position - 1:1}" == "$character" ]]; тогда
        строка=${строка:0:позиция - 1}${замена}${строка:позиция}
    фи
    эхо "$ строка"
сделано

выходы

К 26 Т
-------------------------ТЕ---П---
-------------------------КЭ---П---
П 27 Э
-------------------------ТЕ---П---
-------------------------ТП---П---
С 31 П
-------------------------ТЕ---П---
-------------------------ТЕ---С---
hesey avatar
флаг vn
К сожалению, я сделал небольшую ошибку, набрав «заменено на S, если это P», когда следовало «заменить на P, если это S», но я понял ваш второй подход и переписал его для себя. Большое спасибо!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.