The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"bash: вставка строки из массива после нужной строки"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (Shell скрипты)
Изначальное сообщение [ Отслеживать ]

"bash: вставка строки из массива после нужной строки"  +/
Сообщение от buhenvault email(ok) on 18-Окт-14, 21:08 
Уважаемые коллеги.
Уже третий день сижу с задачей:
Есть файл вида:
[id]
id= 0x03b00063
...
...
[id]
id= 0x03m00063
....
....
[id]
id= 0x01f00063
...
...
[option]
необходимо
после строки удовлетворяющей условию id= 0x03b0* писалась новая строка с параметром force= on
Я уже написал обработку выводящую в массив то, что мне необходимо. Но когда я добавляю этот массив в sed просто ничего не происходит возможно я некорректно обрабатываю переменную.

#!/bin/bash
a=`sed '2!d' 1 | awk '{ print $NF }' | head -c 6`
file="/tmp/1"
sed -i '/forcereal/d' $file
b=(`grep "^id= $a" $file | awk '{print $2}'`)
for i in "${b[@]}"
do
c="id= "$i""
echo $c
sed '/"$c"/a \forcereal= on' $file > /tmp/dellme.tmp
done
cat /tmp/dellme.tmp > $file
rm -f /tmp/dellme.tmp
echo "Ok"
exit 0

Выше echo $c пишет всё что мне надо, т.е. массив тот, который нужен:
id= 0x03b00063
id= 0x03b00069
.....
Остался вопрос конкретно по sed параметр $c я уже пробовал и так "${c[*]}" и с такими '' и с такими ""... В общем помогите пожалуйста.

Ответить | Правка | Cообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "bash: вставка строки из массива после нужной строки"  +1 +/
Сообщение от Аноним (??) on 18-Окт-14, 21:54 
> sed '/"$c"/a \forcereal= on' $file > /tmp/dellme.tmp

Значение переменной не подставляется.

$ c="0x03b0"
$ echo "id= 0x03b000" | sed '/"$c"/a\text'
$ echo "id= 0x03b000" | sed '/'"$c"'/a\text'
$ echo 'id= $c' | sed '/"$c"/a\text'
$ echo 'id= "$c"' | sed '/"$c"/a\text'

Скрипт запутанный.

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "bash: вставка строки из массива после нужной строки"  +/
Сообщение от buhenvault email(ok) on 18-Окт-14, 22:52 
>> sed '/"$c"/a \forcereal= on' $file > /tmp/dellme.tmp
> Значение переменной не подставляется.
> $ c="0x03b0"
> $ echo "id= 0x03b000" | sed '/"$c"/a\text'
> $ echo "id= 0x03b000" | sed '/'"$c"'/a\text'
> $ echo 'id= $c' | sed '/"$c"/a\text'
> $ echo 'id= "$c"' | sed '/"$c"/a\text'
> Скрипт запутанный.

Спасибо большое за ответ, весь сырбор из-за того, что необходимо делать выборку перед тем как использовать sed.
Плюнул и решил всё сделать проще.
Думал чисто передавать полные выражения в массив, как писал выше.
Сделал тупо
echo "id= $a" > /tmp/dellme1.tmp
далее
n=`cat /tmp/dellme1.tmp`
sed '/'"$n"'/a\forcereal= on' $file > /tmp/dellme.tmp

Ответить | Правка | ^ к родителю #1 | Наверх | Cообщить модератору

3. "bash: вставка строки из массива после нужной строки"  +/
Сообщение от Аноним (??) on 18-Окт-14, 23:17 
Пожалуйста!
Если хорошо не знаете sed, то можете использовать awk (может быть более понятно).
Пример.
gawk '
$0 ~ /forcereal/ { next; }
# $0 - текущая строка.
# next - переход к следующей строке.
#  Не выводим строки, содержащие слово"forcereal" (удаляем эти строки)/

# Если текущая строка содержит "id= 0x03b0"
$0 ~ /id=[[:space:]]*0x03b0/ { printf "%s\n%s\n" $0, "force= on"; next; }
# Сначала выводим текущую строку, затем добавляем в вывод строку "id= 0x03b0".

{ print $0; }

# Все остальные строки выводим.

' /tmp/in > /tmp/out

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру