первый плакат здесь, и я довольно долго искал, но не нашел темы, которую я мог бы понять достаточно хорошо, чтобы решить мою проблему.
У меня есть цикл в моем скрипте, который генерирует определенные переменные через разделитель 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.
Я знаю, что задавать хороший вопрос - это совсем другая тема, но я надеюсь, что кто-нибудь поможет мне разобраться в написанном здесь, чтобы я мог продолжать изучать программирование, поскольку я часто перешагиваю через подобные ошибки.
Примечания:
для
для чтения строк файла IFS
и read
, чтобы разделить строку с помощью разделителя Дано:
$ 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---