GNU tar имеет параметр - delete
, который в настоящее время работает и с архивами.
Используйте его, например, так:
tar -vf yourArchive.tar --delete your/path/to/delete
Осторожно: Скорее всего, не будет работать ни с какими магнитными лентами. Но tar
не имеет проблем при работе в конвейере, поэтому вы можете просто использовать временный tar-файл и впоследствии перезаписать им ленту.Он также не будет работать со сжатыми файлами, поэтому вам придется распаковать файл.
Кроме того, операция в любом случае будет довольно медленной из-за (по замыслу) линейной природы упакованных tar-архивов.
Если есть только 1 совпадение:
A=1; B=2; n=$(grep -n 'fff' file.txt | cut -d: -f1)
head -n $((n-B-1)) file.txt ; tail -n +$((n+A+1)) file.txt
В противном случае (awk):
# -vA=a -vB=b -vpattern=pat must be provided
BEGIN{
# add file again. assume single file
ARGV[ARGC]=ARGV[ARGC-1]
++ARGC
}
# the same as grep -An -Bn pattern
FNR==NR && $0 ~ pattern{
for (i = 0; i <= B; ++i)
a[NR-i]++
for (i = 1; i <= A; ++i)
a[NR+i]++
}
FNR!=NR && !(FNR in a)