Добавить две строки перед строкой в ​​файл с помощью awk

Для этого существуют явные инструменты. более распространенный, который можно использовать для удаления \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'

Конечно, есть много других способов сделать это, это лишь некоторые из наиболее распространенных.

Ссылки

2
04.08.2020, 13:55
2 ответа

Я не специалист по 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"и т. д.

1
18.03.2021, 23:15

Изменение существующей попытки. Сложность просмотра различных возможных сценариев инкапсулирована внутри определяемой пользователем функции 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
0
18.03.2021, 23:15

Теги

Похожие вопросы