3

sed で動作する単純な正規表現の置換を取得できません。これが私が直面している例です。

これから、ファイル内の行を置き換えようとしています:

select * from mytable where mytable.s_id=274
select * from mytable where mytable.s_id=275
select * from mytable where mytable.s_id=276
select * from othertable where othertable.id=?
select * from table3 where table3.name=?

これに:

select * from mytable where mytable.s_id=?
select * from mytable where mytable.s_id=?
select * from mytable where mytable.s_id=?
select * from othertable where othertable.id=?
select * from table3 where table3.name=?

私は今のところsedを使用しています:

cat log | sed 's/where mytable\.s_id=[0-9]+/where mytable.s_id=/g' | sort

しかし、sed( 's/where mytable\.s_id=[0-9]+/where mytable.s_id=/g') で使用している正規表現は何も置き換えません。

私はできる限り多くのドキュメントを読んでいますが、私が読んだものはすべて異なっており、物事のやり方も異なっているので、少し迷っています. sed を使用した正規表現置換の標準的な方法は何ですか?また、私の特定のケースではどのように見えるでしょうか?

:直面している問題を単純化しました。私が使用するコマンドラインは実際にはそれよりも複雑であるため、 sedを使用たい(最終的に使用することを学ぶため) 、入力と出力をパイプしたい(ファイルを編集するのではなく)。

4

4 に答える 4

3

引用+

sed 's/where mytable\.s_id=[0-9]\+/where mytable.s_id=?/g'
于 2012-08-28T08:46:32.053 に答える
3
cat log | sed 's/where mytable\.s_id=[0-9]\+/where mytable.s_id=?/g'

+ の前にバックスラッシュを付けるだけです。

于 2012-08-28T08:49:17.073 に答える
1

awkに興味がある場合

awk -F= '{$2="=?";print}' temp

以下でテスト。

> cat temp
select * from mytable where mytable.s_id=275
select * from mytable where mytable.s_id=276
select * from othertable where othertable.id=?
select * from table3 where table3.name=?
> awk -F= '{$2="=?";print}' temp
select * from mytable where mytable.s_id =?
select * from mytable where mytable.s_id =?
select * from othertable where othertable.id =?
select * from table3 where table3.name =?
于 2012-08-28T08:57:31.620 に答える
1

私の知る限り、一部の sed は について知りません+。したがって、これを試してください:

 cat log | sed 's/where mytable\.s_id=[0-9]*/where mytable.s_id=?/g' | sort

編集:これ+はGNU拡張であり、それを使用する場合(およびsedがそれを認識している場合)、チョロバが提案したようにエスケープする必要があります。

于 2012-08-28T08:45:42.880 に答える