awk不会打印换行符

时间:2010-02-01 23:30:40

标签: awk newline

我使用以下代码更改现有的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 个答案:

答案 0 :(得分:2)

这样做。使用-v

将变量从shell传递到awk
#!/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
}

答案 1 :(得分:2)

如果你从等式中取出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
$

反引号运算符过早地将输出扩展为shell“单词”。你可以在shell中使用$IFS变量(yikes),或者你可以使用双引号。

如果您运行的是现代sh(例如kshbash,而不是“经典”Bourne sh),您可能还想使用{ {1}}语法(更容易找到匹配的开始/结束分隔符)。