Для этого существуют явные инструменты. более распространенный, который можно использовать для удаления \r\n
из файлов, называется dos2unix
.
Если это недоступно в вашей системе, вы можете использовать одну из следующих команд, чтобы сделать что-то подобное с вашей textFileLines
переменной:
$ echo "$textFileLines" | awk 1 RS='\r\n' ORS=
Сед 1 $ echo "$textFileLines" | sed -e 's/\r//g'
Сед 2 $ echo $textFileLines | sed $'s/\r//'
тр $ echo "$textFileLines" | tr -d '\r'
Конечно, есть много других способов сделать это, это лишь некоторые из наиболее распространенных.
Я не специалист по awk
(, но python
), но $i
дает одну строку, и вы сравниваете ее со строкой, состоящей из двух строк "allow = alaw\nallow = g729"
-, и это проблема. Вы должны проверять каждую строку отдельно.
Я создал код, который проверяет $(i-1)
и $(i-2)
и сравнивает отдельно с"allow = alaw"
(FIRST )и"allow = g729"
(SECOND ). Таким образом, я разделил его на три ситуации
FIRST - exist, SECOND - missed
FIRST - missed, SECOND - missed
FIRST - missed, SECOND - exist
и добавьте другое значение к $i
или $(i-1)
BEGIN {
RS=""; ORS="\n\n"; FS=OFS="\n"
skip["[general]"]
skip["[providertrunk0]"]
addCodec1 = "allow = alaw"
addCodec2 = "allow = g729"
tgt = "nat = no"
}
!($1 in skip) {
for (i=1; i<NF; i++) {
if ($(i) == tgt) {
# FIRST - exist, SECOND - missed
if ( ($(i-1) == addCodec1) ) {
$i = addCodec2 OFS $i
}
# FIRST - missed, SECOND - missed
else if ( ($(i-1) != addCodec1) && ($(i-1) != addCodec2) ) {
$i = addCodec1 OFS addCodec2 OFS $i
}
# FIRST - missed, SECOND - exist
else if ( ($(i-2) != addCodec1) && ($(i-1) == addCodec2) ) {
$(i-1) = addCodec1 OFS $(i-1)
}
}
}
}
{ print }
Кстати,:Чтобы сделать его более неуниверсальным (и проще ), я запускал его два раза с разными аргументами.
Первый поставить только "allow = g729"
перед "nat = no"
, второй поставить только "allow = alaw"
перед "allow = g729"
.
Таким образом, я мог запустить его снова, чтобы поставить "third line"
до "allow = alaw"
, и запустить его снова, чтобы поставить "fourth line"
до "third line"
и т. д.
Изменение существующей попытки. Сложность просмотра различных возможных сценариев инкапсулирована внутри определяемой пользователем функции fx (). В зависимости от того, по какому индексу находится линия tgt, строятся различные возможные сценарии.
$ cat addCodec.txt
BEGIN {
RS=""; ORS="\n\n"; FS=OFS="\n"
skip["[general]"]
skip["[providertrunk0]"]
e1 = "allow = alaw"
e2 = "allow = g729"
a[e2] = a[e1] = 1
addCodec = e1 OFS e2
tgt = "nat = no"
}
!($1 in skip) {
for (i=1; i<=NF; i++) {
if ($i "" == tgt) {
fx(i)
break
}
}
}
{ print }
function fx(i, cond) {
cond = (i>2 ? (a[$(i-2)]+0) : 0) "" (i>1 ? (a[$(i-1)]+0) : 0)
if ( cond "" == "11" ) { $(i-2) = e1; $(i-1) = e2 }
else if ( cond "" == "01" ) { $(i-1) = addCodec }
else if ( cond ~ /0$/ ) { $(i) = addCodec OFS $(i) }
}
$ awk -f addCodec.txt file