Member 13633617 Ответов: 2

Мне нужно добавить новую строку и A { в каждой 5-й строке текстового файла и a } в последней строке.


Фактическое Содержимое Файла :

FORMAT_VERSION:01.03
FILE_DATE:20180123171011
FILE_ID:01231711
CCBSFormatVersion(03.00)
FileData(ABCD,4)
UpdateSubscription(*******000*****,IMSI)
{
        DestinationAddress()
}
RemoveSubscriptionFromGroup(***************,IMSI,"Prepaid")


Мне нужен следующий формат:

FORMAT_VERSION:01.03
FILE_DATE:20180123171011
FILE_ID:01231711
CCBSFormatVersion(03.00)
FileData(ABCD,4)
{
UpdateSubscription(*******000*****,IMSI)
{
        DestinationAddress()
}
RemoveSubscriptionFromGroup(***************,IMSI,"Prepaid")
}


Что я уже пробовал:

Я пробовал sed с различными вариантами. Пожалуйста, помогите мне с командой на основе UNIX.

CPallini

Если вы вставляете " {"в каждую 5-ю строку и только"} " в конце файла, то вы можете получить несбалансированные фигурные скобки. Это ты реллэй хочешь?

Member 13633617

Мне нужна открывающая скобка, начиная со строки ниже 5-й строки ( необходимо вставить новую строку с открывающей скобкой) и закрывающая скобка в строке ниже последней строки. это формат, который определяет наша система.

необходимый формат, который мне нужен, это:

FORMAT_VERSION:01.03
Дата файла:20180123171011
Идентификатор файла:01231711
CCBSFormatVersion(03.00)
FileData(ABCD,4)
{
UpdateSubscription(*******000*****,IMSI)
{
DestinationAddress()
}
RemoveSubscriptionFromGroup(***************,IMSI,"предоплата")
}


Но в настоящее время наш формат файла неверен:

FORMAT_VERSION:01.03
Дата файла:20180123171011
Идентификатор файла:01231711
CCBSFormatVersion(03.00)
FileData(ABCD,4)
UpdateSubscription(*******000*****,IMSI)
{
DestinationAddress()
}
RemoveSubscriptionFromGroup(***************,IMSI,"предоплата")

2 Ответов

Рейтинг:
8

Member 13633617

Решение :

делать

СЕПГ -я 5а {' $файл
sed -i '$a }' $файл

сделано


Рейтинг:
16

CPallini

awk '//{if (n==4) print("{"); print($0);++n}END{printf("}\n");}' <filename>

(где <filename> это имя исходного файла)
это бы сработало.


Member 13633617

Это работает идеально!!
Еще одна проблема-эта команда выдает выходные данные в виде обратной связи в оболочке unix. Я хочу, чтобы выходные данные этой команды были напечатаны в самом файле с тем же именем файла. Кроме того, могу ли я запустить несколько файлов, используя только одну команду, например, я включу все имена файлов, используя * -- filename* . Спасибо!!

CPallini

Вы можете перенаправить вывод в файл, например

awk '//{if (n==4) print("{"); print($0);++n}END{printf("}\n");}' input.txt > output.txt

И да, вы можете запустить его на нескольких файлах. Смотрите, например:
https://stackoverflow.com/questions/20796200/how-to-iterate-over-files-in-a-directory-with-bash

Member 13633617

Спасибо.