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

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

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

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

for input in $(tail -n 3 filea)
do
        a="$(echo $input | cut -d "," -f 1)"
        b="$(echo $input | cut -d "," -f 2)"
        c="$(echo $input | cut -d "," -f 3)"

        echo $a
        echo $b
        echo $c

        tail -n 1 fileb | sed 's,'$a','$c',2'
done

С выводом:

K
26
T
KTTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
P
27
E
KKTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
S
31
P
KKTXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

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

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

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

1
задан 19 July 2021 в 18:01

1 ответ

Примечания:

Дано:

$ cat filea
K,26,T
P,27,E
S,31,P

$ cat fileb
-------------------------TE---P---

, затем

tail -n 3 filea | while IFS=, read -r replacement position character; do
    printf -v regex '^(.{%d})%s' $((position - 1)) "$character"
    printf -v repl  '\\1%s' "$replacement"

    echo "$regex"
    echo "$repl"

    tail -n 1 fileb
    tail -n 1 fileb | sed -E "s/$regex/$repl/"
done

выводит:

^(.{25})T
\1K
-------------------------TE---P---
-------------------------KE---P---
^(.{26})E
\1P
-------------------------TE---P---
-------------------------TP---P---
^(.{30})P
\1S
-------------------------TE---P---
-------------------------TE---S---

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

tail -n 3 filea | while IFS=, read -r replacement position character; do
    echo "$replacement   $position   $character"
    line=$(tail -n 1 fileb)
    echo "$line"
    if [[ "${line:position - 1:1}" == "$character" ]]; then
        line=${line:0:position - 1}${replacement}${line:position}
    fi
    echo "$line"
done

выходы

K   26   T
-------------------------TE---P---
-------------------------KE---P---
P   27   E
-------------------------TE---P---
-------------------------TP---P---
S   31   P
-------------------------TE---P---
-------------------------TE---S---
1
ответ дан 28 July 2021 в 11:17

Другие вопросы по тегам:

Похожие вопросы: