Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Добавить строки на основании содержимого файла.  (Прочитано 250 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн kolesov

  • Автор темы
  • Участник
  • *
  • Сообщений: 189
    • Просмотр профиля
Всем привет!
Еще раз прошу помощи в решении проблемы.
Есть файл вида:
[user0]
macaddress = rrttyy44ee22
[user1]
macaddress = qqeettvv4477
[user2]
macaddress = ccee77bbnnrr
[user3]
macaddress = ttrriidd78xx
[user4]
macaddress = rroo3212ddcc
нужно изменить этот файл до такого вида:
[user0]
username = user0
macaddress = rrttyy44ee22
[user1]
username = user1
macaddress = qqeettvv4477
[user2]
username = user2
macaddress = ccee77bbnnrr
[user3]
username = user3
macaddress = ttrriidd78xx
[user-user444]
username = user-user444
macaddress = rroo3212ddcc
Подскажите пожалуйста как.

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
Не очень понятно, какие могут быть юзеры.

Но по-моему, как-то так:
Код: Bash
  1. sed -e 's/\(\[\)\(user.*\)\(\]\)/&\nusername = \2/' your_file_neim_with_data.ext

Код: Bash
  1. man sed
Делюсь знаниями, но их у меня мало!

Оффлайн zg_nico

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 1015
  • Nil mortalibus arduum est
    • Просмотр профиля
Подскажите пожалуйста как.
Или, если поизвращаться, можно соорудить построчное чтение файла, и выполнения одного из двух действий по условию: либо формирование и дописывание новой строки, либо просто перенос существующей (sed специально не трогаю).#!/bin/bash
ModifyFile=''
while read line
    do
    if [[ $line == \[*\] ]]; then
ModifyFile=$ModifyFile"$line\n"
#получаем имя пользователя
nUname=${line/\[/}
nUname=${nUname/\]/}
#вставляем нашу строку
ModifyFile=$ModifyFile"username = $nUname\n"
else
ModifyFile=$ModifyFile"$line\n"
fi
done < /full/path/to/file/file.txt
echo  -e "$ModifyFile"
Оговорки: 1. /full/path/to/file/file.txt - путь к Вашему файлу. 2. Если хотите изменения не вывести на экран, а напрямую в файл напечатать, то вместо echo  -e "$ModifyFile" в последней строчке следует написать echo  -e "$ModifyFile" > /full/path/to/my/output/file/file2.txt, при условии что папка /full/path/to/my/output/file/ существует и у текущего пользователя есть права на запись в нее.
Thunderobot G150-D2: Intel SkyLake Core i7-6700HQ 2.60GHz, 8Gb DDR4 2133 MHz, Intel HD530, NVidia GeForce GTX 960M 2Gb.  Ubuntu 16.04 64x [Unity], Ubuntu 18.04 64x [KDE, Budgie].

Оффлайн victor00000

  • Старожил
  • *
  • Сообщений: 14672
  • Я не слышу.
    • Просмотр профиля
#!/bin/bash

t=`mktemp`

[ "$1" == "" ] && exit 1
ls $1 1>/dev/null || exit 1
[[ "$2" == "-a" || "$2" == "-d" ]] || \
{ echo ERR 1; exit 1; }

[[ "$2" == "-a" ]] && ( [[ "$3" == "["*"]" ]] || \
{ echo ERR 2; exit 1; } )

[[ "$2" == "-a" && "$4" == "" ]] && \
{ echo ERR 3; exit 1; }
[[ "$2" == "-d" && "$3" == "" ]] && \
{ echo ERR 4:; exit 1; }

# exit
b=0
while read a
do
if [ "$2" == "-d" ];then
[[ "$3" == *"$a"* ]] || \
echo "$a"
continue
fi

[[ "$b" == "1" && \
"$a" == "" ]] && b=2

[[ "$b" == "1" && \
"$a" == *"["*"]"* ]] && b=2
[[ "$b" == "0" && "$a" == *"$3"* ]] && b=1

if [ "$b" == "2" ];then
echo "$4"
fi
echo "$a"
[ "$b" == "2" ] && b=0
done < $1 > $t
# exit


[ "$b" == "1" ] && \
echo "$4" >> $t

cp $t $1
echo Ok



5:L~/z18$
5:L~/z18$ cat t.txt
[aa]
a=1
aa=2
[bb]
b=1
[cc]
cc=0
5:L~/z18$
5:L~/z18$ ./ad_sett.sh t.txt -a [bb] cccccccccc
Ok
5:L~/z18$
5:L~/z18$ cat t.txt
[aa]
a=1
aa=2
[bb]
b=1
cccccccccc
[cc]
cc=0
5:L~/z18$
5:L~/z18$ ./ad_sett.sh t.txt -a [cc] cccccccccc
Ok
5:L~/z18$
5:L~/z18$ cat t.txt
[aa]
a=1
aa=2
[bb]
b=1
cccccccccc
[cc]
cc=0
cccccccccc
5:L~/z18$
5:L~/z18$ ./ad_sett.sh t.txt -d cccccccccc
Ok
5:L~/z18$
5:L~/z18$ cat t.txt
[aa]
a=1
aa=2
[bb]
b=1
[cc]
cc=0
5:L~/z18$

« Последнее редактирование: 02 Июль 2018, 16:33:30 от victor00000 »
~.o

 

Страница сгенерирована за 0.069 секунд. Запросов: 24.