0

私はawkを初めて使用します。テキストファイルを交換するために何かを書こうとしましたが、失敗しました。

のように出力したい'hello'
I used command awk '{print "'hello'"}' filenameto do it.but failed:
output like: hello
but I used command awk '{print "\'hello\'"}' filenameto do it.failed again:
output like: >
ok.awk コマンドは私の言いたいことを理解していないようです。そのため、問題を解決する方法について混乱しています。
みんなありがとう。

4

4 に答える 4

2

アスキーコードを使用する:

awk '{print "\x27" "hello" "\x27"}' filename

変数の使用:

awk -v q="'" '{print q "hello" q}' filename

例:

$ seq 2 > filename
$ awk '{print "\x27" "hello" "\x27"}' filename
'hello'
'hello'
$ awk -v q="'" '{print q "hello" q}' filename
'hello'
'hello'
于 2013-09-24T05:09:28.283 に答える
1

単純に二重引用符を使用します。

awk "{print \"'hello'\"}" filename

それはあなたのファイルを実際には変更しませんが。

于 2013-09-24T05:10:24.027 に答える
1

clyfish の答えは、一重引用符を出力する必要があり、コマンドラインで渡すスクリプトを使用する必要がある場合に機能します。

ただし、このような場合、引用を行う必要があるが「実際の」awkスクリプトを書きたくない場合に、私が通常行うことは次のとおりです。

awk 'function q(word) { return "\"" word "\"" } 
     { printf("mv %s SomeDir/;", q($0)) }'

私が行ったことは、二重引用符で囲まれたものを返す関数を定義することです。実際に使用するには、printf を使用します。それをしなければ、私はしなければならなかったでしょう:

awk '{ print("mv \"" $0 "\" SomeDir/;") }';

それはかなり厄介になります。より複雑な例では、これは命の恩人になる可能性があります。

ただし、実際の一重引用符を使用して何かを出力する必要があるとします。その場合、コマンド ラインでこのようなスクリプトを渡そうとするときに奇妙なシェル クォーティング ルールを処理すると、完全に気が狂ってしまうので、単純な使い捨てファイルを作成することをお勧めします。

#!/usr/bin/awk
# hi.awk
{ print("'hello'") }

それを呼び出します:

awk -f ./hi.awk

#!そのようにすれば、ファイル内の行は実際には必要ありませんが、害もありません。

于 2013-09-24T05:22:01.940 に答える