2017-01-14 4 views
0

私はLinuxを使い始めたばかりで、ファイル内のテキストの一部を検索/置換しようとしています。「./」を置き換えます。 in awk

私は正常GSUB使用して "0/0" を検索と置換することができました: "./" 私は交換してみた場合、しかし、

awk '{gsub(/0\/0/,"0")}; 1' filename

を同じ考え

を用いawk '{gsub(/\.\/\./,"U")}; 1' filename

出力は切り捨てられ、第一の位置で停止し、「./」。ファイル内にあります。そんなこと知ってる "。"特別なワイルドカード文字ですが、その前に "\"があるとそれを中和すると思っていました。私は検索しましたが、私が使用した式がファイルを切り捨てる理由を説明することができませんでした。

ご意見をいただければ幸いです。ありがとうございました。 awkの基本的なアウトラインがされていることを

+0

awkは、このような操作に最適なツールではありません。あなたが自分の選択をすることが許されているなら、代わりに 'sed'を使うことを提案します。 – DyZ

+0

もし 'echo" abc./.def "| awk 'gsub(/\.\/\./、 "U")' '期待通りに動作します。 – dawg

+0

http://stackoverflow.com/help/mcve – melpomene

答えて

1

リコール:最も一般的なパターンはラインに対して正規表現またはテストです

awk 'pattern { action }' 

カウント:

awk '/FOO/ { do_something_with_a_line_with_FOO_in_it }' 
awk 'FNR==10' 

デフォルトがあるので、最後のものが何もアクションを持っていません行を印刷します。

しかし、値を返す関数もパターンとして使用できます。 gsubは関数であり、置換の数を返します。

だから、与えられた:

$ echo "$txt" 
abc./.def line 1 
ghk/lmn won't get printed 
abc./.def  abc./.def printed 

あなたが行うことができます成功した置換を有する線のみ印刷するには:

$ echo "$txt" | awk 'gsub(/\.\/\./,"U")' 
abcUdef line 1 
abcUdef  abcUdef printed 

を実行したいので、あなたはアクションブロックにgsubを配置する必要はありませんそれはすべての行にあり、何が起こったかについての返品があなたに何かを伝えます。 gsubは置換の数を返すので、正常にマッチした行が出力されます。

が一致している場合、あなたは関係なく、印刷されたすべての行をしたい場合:

$ echo "$txt" | awk 'gsub(/\.\/\./,"U") || 1' 
abcUdef line 1 
ghk/lmn won't get printed 
abcUdef  abcUdef printed 

それとも、あなたはその後、空のパターンとアクションと空のアクションと1としての機能を使用することができます。

$ echo "$txt" | awk '{gsub(/\.\/\./,"U")} 1' 
abcUdef line 1 
ghk/lmn won't get printed 
abcUdef  abcUdef printed 

いずれの場合も、アクションのないパターンとして1が一致するかどうかにかかわらず行を印刷し、一致する場合にはgsubがあれば置換します。

第2のawkはあなたのものです。なぜあなたの入力データに作用していないのかは、おそらく入力データに関係しています。

1

あなたのawkスクリプトは問題ありません。あなたの入力にはおそらくWindowsプログラムによって作成されたcontrol-Mが含まれています。 cat -v fileと表示され、dos2unixなどを使用してそれらを削除できます。

関連する問題