awk не будет печатать символы новой строки - PullRequest
2 голосов
/ 02 февраля 2010

Я использую приведенный ниже код для изменения существующего сценария awk, чтобы можно было добавлять все больше и больше дел с помощью простой команды.

echo `awk '{if(/#append1/){print "pref'"$1"'=0\n" $0 "\n"} else{print $0 "\n"}}' tf.a

обратите внимание, что первый отпечаток - "pref'"$1"'=0\n", поэтому он ссылается на переменную $1 в своем окружении, а не на awk.

Команда ./tfb.a "c" должна изменить код с:

BEGIN{
#append1
}
...

до:

BEGIN{
prefc=0
#append1
}
...

Однако, это дает мне все в одной строке.

Кто-нибудь знает, почему это так?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2010

Если вы берете awk прямо из уравнения, вы можете видеть, что происходит:

# Use a small test file instead of an awk script
$ cat xxx
hello
there
$ echo `cat xxx`
hello there
$ echo "`cat xxx`"
hello
there
$ echo "$(cat xxx)"
hello
there
$

Оператор обратного тика слишком рано расширяет вывод в слова оболочки.Вы можете поиграть с переменной $IFS в оболочке (yikes) или использовать двойные кавычки.

Если вы используете современный sh (например, ksh или bash, а не "классический" Борн sh), вы также можете использовать синтаксис $() (этолегче найти соответствующий начальный / конечный разделитель).

2 голосов
/ 02 февраля 2010

сделай это так. передать переменную из оболочки в awk, используя -v

#!/bin/bash
toinsert="$1"
awk -v toinsert=$toinsert '
/#append1/{
    $0="pref"toinsert"=0\n"$0
}
{print}
' file > temp
mv temp file

выход

$ cat file
BEGIN{
#append1
}

$ ./shell.sh c
BEGIN{
prefc=0
#append1
}
...