Попробуйте:
$ awk '/test1/{f=0} !f{print} /test1\/end/{f=1}' sentence.txt
20 /test1/catergory="Food"
20 /test1/target="Adults, \"Goblins\", Elderly,
Babies, \"Witch\",
Faries"
20 /test1/type="Western"
20 /test1/theme="Halloween"
20 /test1/end=category
20 /test1/Purpose=
20 /test1/my_purpose="To create
a fun-filled moment"
20 /test1/end=Purpose
При запуске awk любая неопределенная переменная по умолчанию принимает значение false. Таким образом, при запуске awk f
будет ложным. Затем Awk будет читать каждую строку по очереди и выполнять следующие три команды:
/test1/{f=0}
Для любой строки, содержащей test1
, мы устанавливаем переменную f
в false (0 ).
Когда мы находимся в диапазоне строк, которые мы хотим напечатать, f
будет установлено значение false.
!f{print}
Если f
ложно, вывести текущую строку.
/test1\/end/{f=1}
Для любой строки, содержащей test1/end
, установите для f
значение true (1 ).
Это означает, что мы не должны печатать следующие строки, пока не дойдем до строки, содержащей test1
.
awk -v a="test1" -v b="test1/end" '$0~a{f=0} !f{print} $0~b{f=1}' sentence.txt
Sed не предназначен для арифметики. Вы можете попробовать неуклюжие обходные пути, но Awk в этом отношении лучше :
.awk '!/^[#@]/{printf("%.1f\n",$2*10)}' file
В GNU Awk добавьте -i inplace
для редактирования файла на месте. Если у вас нет GNU Awk,вы можете использоватьsponge
awk '!/^[#@]/{printf("%.1f\n",$2*10)}' file | sponge file
или используйте старую добрую перезапись (в любом случае это то, что происходит под капотом...)
awk '!/^[#@]/{printf("%.1f\n",$2*10)}' file > newfile &&
mv newfile file