В случае, если у вас нет доступа к инструментам, которые поддерживают обходные пути, этот подход, хотя и длительный, будет надежно работать с использованием стандартных инструментов на любой машине UNIX:
awk '{
gsub(/@/,"@A"); gsub(/{/,"@B"); gsub(/}/,"@C"); gsub(/pattern1/,"{"); gsub(/pattern2/,"}")
out = ""
while( match($0,/{[^{}]*}/) ) {
out = (out=="" ? "" : out ORS) substr($0,RSTART,RLENGTH)
$0 = substr($0,RSTART+RLENGTH)
}
$0 = out
gsub(/}/,"pattern2"); gsub(/{/,"pattern1"); gsub(/}/,"@C"); gsub(/{/,"@B"); gsub(/@A/,"@")
} 1' file
Вышеописанное работает путем создания символов, которые не могут существовать во входных данных (сначала изменяя эти символы {
и }
на некоторые другие строки @B
и @C
), чтобы они могли использовать эти символы в отрицательный символьный класс, чтобы найти целевые строки, а затем он возвращает все измененные символы в их исходные значения. Вот некоторые рисунки, чтобы сделать более очевидным, что происходит на каждом шаге:
awk '{
print "1): " $0 ORS
gsub(/@/,"@A"); gsub(/{/,"@B"); gsub(/}/,"@C"); gsub(/pattern1/,"{"); gsub(/pattern2/,"}")
print "2): " $0 ORS
out = ""
while( match($0,/{[^{}]*}/) ) {
out = (out=="" ? "" : out ORS) substr($0,RSTART,RLENGTH)
$0 = substr($0,RSTART+RLENGTH)
}
$0 = out
print "3): " $0 ORS
gsub(/}/,"pattern2"); gsub(/{/,"pattern1"); gsub(/}/,"@C"); gsub(/{/,"@B"); gsub(/@A/,"@")
print "4): " $0 ORS
} 1' file
1): pattern1 this is the first content pattern2 this is some other stuff pattern1 this is the second content pattern2 this is the end of the file.
2): { this is the first content } this is some other stuff { this is the second content } this is the end of the file.
3): { this is the first content }
{ this is the second content }
4): pattern1 this is the first content pattern2
pattern1 this is the second content pattern2
pattern1 this is the first content pattern2
pattern1 this is the second content pattern2