2

次の内容のテキストファイル( "file.txt")があります。

#   disutil_screening = 0.00000; # favorable
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

GNU Sedを使用して、これらの3行(「favorable」、「base」、または「unfavorable」のいずれか)のどれをコメントアウトするかを切り替える必要があります。

「好ましい」行を次のようなコードと一致させることができることを知っています(ダミーの例として、テキストを「aaa」に置き換えるだけです)。

$ cat file.txt | sed -r 's/#[\t]disutil_screening[\ =0-9\.;]+# favorable/aaa/'
aaa
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

ただし、このSedステートメントの例は、私が実際に望んでいるものとは明らかにかけ離れています。先頭の「#」を削除するだけのSed式が必要です。つまり、$EXPR上記の「file.txt」の内容が次のように変更されるようなSed式()が必要です。

$ cat file.txt | sed -r $EXPR
    disutil_screening = 0.00000; # favorable
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable

これを行う方法(「好ましい」行の先頭の「#」を「」に置き換える)がわかれば、「ベース」行に「#」を追加する方法(つまり、コメントアウト行)を理解できると思います。現在コメントアウトされていません)。

:私はsedの代わりにawkをこのタスクに使用することにオープンですが、awkに少し怖がっており、これまで使用したことがありません。

4

3 に答える 3

6

必要なのはグルーピングだと思います。これを試してください:

$ cat file.txt | sed -r 's/#([\t]disutil_screening[\ =0-9\.;]+# favorable)/\1/'

最初のコメント文字がグループに含まれることを期待してすべての一致をラップし、次に一致全体をこのグループに置き換えて、最初の文字が削除されるようにしました。

于 2013-02-07T22:29:19.590 に答える
4

これが私が思いついたものです。-iは置換をインラインにします(つまり、元のファイルが変更されます)。

$ sed -i 's/^#\(.*# favorable\)$/ \1/' text.txt
于 2013-02-07T22:33:26.833 に答える
3

awkを使用する

awk -F= '$2 ~ / favorable/{sub("#","")}1' temp.txt

出力

   disutil_screening = 0.00000; # favorable
    disutil_screening = 0.00009; # base
#   disutil_screening = 0.00019; # unfavorable
于 2013-02-08T01:43:54.057 に答える