2016-05-20 16 views
1

私は、ポイントで文字列を見て、ダブルドル記号($$)、ダブルドル記号(inbetween($ 123 $)、シングルドル記号と_。私は非常に簡単に2つの正規表現のgsubでやったが、私は1つの正規表現でそれを行うことができるように、私はそれをロックダウンすることができない狂った私を運転するように感じる。おそらく時間やスピードには関係ありませんが、この時点で私はちょっと凝縮された方法があるかどうか、あるいは私が狂っているかどうかを知る必要があります。

gsub (/\$[0-9]*\$/, "_", $1); 
gsub (/\$/, "_", $1); 

は私が

gsub (/\$[0-9]*\$*/, "_", $1); 

を使用して1行でそれを設定しても問題がなかったと思ったが、私は実現しなかったのインスタンスがありました。ここで

は、私が現在持っているものです1ドル記号は、数字ではなく、ドル記号を置き換えたいだけの数字($ 123)に従います。だから、私は数字が一致した場合は1ドル記号、次に0以上の数字、1ドル記号、または数字がない場合は0〜1(またはそれ以上)はドル記号と一致する必要があります。

編集:申し訳ありませんが、私は入力と出力の良い例を挙げませんでした。

入力:

foo$bar$$foofoo$353$foobar$123 
abc$123$xyz$$123abc$def$$hij$456$klm 

出力:

foo_bar_foofoo_foobar_123 
abc_xyz_123abc_def_hij_klm 

希望私が何をしたいの詳細は明らかです。

+1

'\ $([0-9] + \ $ | \の$?)簡潔でテスト可能なサンプル入力と予想される出力を含めるように質問してください。 ' – melpomene

+1

'/^\ $(\ d + \ $)?$ /' –

+0

スクリプトが正しく機能しない場合や、入力と出力に一致させたい文字列の前後にコンテキストを含めること(削除しない場合)を含めることは特に重要です。 –

答えて

2

あなたの要件はあまり明確ではありませんが、これは何ですか?

$ awk '{sub(/\$([0-9]*\$)*/,"_")}1' file 
_ - match 
_ - match 
_ - match 
_123 - don't match 

IDK上記の私が仮定するもの与えられた期待出力かは、あなたの投稿のサンプル入力される場合:

$ cat file 
$ - match 
$$ - match 
$124$ - match 
$123 - don't match 
1

私はawkが正規表現で否定的な先読みをサポートしているとは思わないので、プログラムロジックを使用する必要があります。 $123が行われている任意の置換を防ぐため

gsub(/\$[0-9]*\$/, "_", $1); 
if ($1 ~ /\$/ && $1 !~ /\$[0-9]/) gsub(/\$/, "_", $1); 

しかし、これは、$foo $123のような文字列では動作しません。

GNU Awkを使用している場合は、そのgensub関数を使用して置換でキャプチャグループを使用できます。次に、$の後ろに桁ではないものをマッチさせ、非桁を置換えにコピーすることができます。

gensub(/\$([^0-9]|$)/, "_\\1", "g", $1); 
関連する問題