Sed —一致した行の文字を所定の位置に置き換えますか?


21

このような行を含むファイル内:

# lorem ipsum blah variable

#特定の文字列を含む同じ行の文字を削除します(コメント)。であるsed。このために良いですか?

この条件付きの動作を取得するのに苦労しています。これには「不器用な」方法があります。awkまたはで一致する行番号を見つけて、sedこの番号を別のsedコマンドで使用できますが、これははるかに良い方法で実行できると考えています。

回答:


36

操作対象の行のセレクターとして、探している文字列を使用します。

sed '/ipsum/s/#//g'

/ipsum/「ipsum」を含む行を選択し、これらの行でのみ後続のコマンドが実行されます。中括弧を使用して、より多くのコマンドを実行できます

/ipsum/{s/#//g;s/@/-at-/g;}

4
同意する; これが最良の答えです(唯一ではありませんが)。コメント:(1)は行のすべての文字's/#//g'を削除します#。それが望んでいない場合は、削除しますg(「グローバル」の略)。(2)所定の場所でファイルを編集するには(質問で求められたとおり)、を使用しますsed -i
Gマンは「Reinstate Monica」と言います

2
(3)実際の状況では、行のコメントを解除したい場合sed -i '/ipsum/s/#[[:space:]]*//'、を使用して、の直後のスペースとタブを削除することをお勧めします#。(4)#が行の最初の非空白文字であることを確認することも検討できます。現在のコマンドは#、行から削除しますprompt "Enter # of ipsums:"ます。
G-Manは「Reinstate Monica」と言います

1
@ G-Man-すばらしい追加!2番目のpt(先頭のスペース)についてはどうsed -i '/ipsum/s/^#[[:space:]]*//'ですか??!(^が意味は、行の先頭$行の終わりのために) -少なくともGNUでのsed ...
ジェレミー・デイヴィス

1
@JeremyDavis:はい、正規表現を行の先頭にで固定できます^、それは間違っています。コードの#直前にインデントされたコードをコメントアウトすることが多いので、#インデントされます。それをするのは私だけだとは思わない。
G-Manが「Reinstate Monica」と

1
@ G-Man-ああ、もちろん!おかげで、私はそれを考えていませんでした。したがって、^&の間の空白もチェックする必要があるため#、次のようにします/ipsum/{/^[[:space:]]*#/s/#[[:space:]]*//}#それでも、場所によっては問題が発生する場合があります(たとえば、空白のインデント/分離を使用する言語)。
ジェレミーデイビス

7
$ cat input.txt
# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
# lorem ipsum blue variable

その後:

$ sed 's|# \(.*blue.*\)|\1|' input.txt

与える:

# lorem ipsum blah variable
# lorem ipsum blat variable
# lorem ipsum blow variable
# lorem ipsum blip variable
lorem ipsum blue variable

次のように機能します。

s伝えsed、それは正規表現が見つかったものを代用する必要があること。

パターンは # \(.*blue.*\)に分類されます:ハッシュの後にスペースが続きます。括弧(\()はグループ化を開始します。前後に何でも.*blue.*ある単語blueです。次の括弧(\))はグループ化を閉じます。

置換は\1、最初のグループ化ブラケットのコンテンツへの後方参照です。


3

ExモードでVimを使用できます。

ex -sc '/ipsum/s/#//|x' file
  1. s 代替

  2. x 保存して閉じます


それはいいね。私はそれについて知りませんでした!TBH、この質問に対する最良の答えかどうかはわかりません(IMOの主要な答えは1つです)が、それでも非常にクールです!投稿していただきありがとうございます。
ジェレミーデイビス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.