Sed Regexpコマンドが機能しません

Sed Regexpコマンドが機能しません

したがって、ファイルには次のような行があります。

#multiline.pattern: ^\[

私はそれを置き換えるためにsedを使ってみました。

multiline.pattern: '^\['

これを実行するために使用するコマンドは次のとおりです。

sudo sed -i 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g' /etc/filename.txt

ただし、このコマンドを実行するたびに、次の結果が表示されます。

ここに画像の説明を入力してください。

誰かが私がここで何を間違っているのか教えてもらえますか?

ありがとうございます!

答え1

あなたの例を考えると、次のように動作します。

$ cat ex
#multiline.pattern: ^\[

$ sed -e "s/^#multiline\.pattern:.*/multiline.pattern: '^\\\['/" ex
multiline.pattern: '^\['

#multiline.pattern:これにより、 で始まる行と行の最後まで、必要な数の文字が出てくる行が、所望のパターンに置き換えられます。

あなたが求めているパターンにはいくつかの特別な記号(、、) が含まれて\います[\\\\\[[

答え2

この問題を解決できます。sed "s@\^@\'\^@;s/$/\'/"

$ cat > toto
#multiline.pattern: ^\[
$ sed "s@\^@\'\^@;s/$/\'/" toto
#multiline.pattern: '^\['

アイデアは、正規表現を単純化するために、2回の連続操作で「^by '^」を「行末」に変更し、次に「行末」を「行末」に置き換えることです。'

もちろん、sed -i ...ファイルを修正するために使用します。

答え3

間違った点は最後の部分です。先頭:

sed 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g'
  # ^                                               ^             ^ ?

最後の部分は、backslash別の一重引用符が終わるまでエスケープされます。開いている。これが、引用符が別の引用符で終わるまで、さらに入力できるようにbash求められます。$PS2>'

最後のものを削除する'と動作します。

sed 's/multiline.pattern: \^\\\[/multiline.pattern: '\'\^\\\\[\'/g
# or:
sed 's/multiline.pattern: ^\\\[/multiline.pattern: '"'^\\\['/g"
sed "s/multiline.pattern: ^\\\\\[/multiline.pattern: '^\\\['/g"
sed 's/multiline.pattern: ^\\\[/multiline.pattern: \x27^\\[\x27/g'

返品:

  • 例の出力から削除したいようです#。これを行うには、一致パターンにそれを含めますsed(希望の引用スタイルを使用)。
sed 's/#multiline...'
  • 括弧を使用してパターンの一部を「キャプチャ」して、代替アイテムで再利用することができます(と呼ばれる)。サブ式と逆参照):
sed -r 's/#(multiline\.pattern: )(\^\\\[)/\1'\'\\2\'/g

-r/を使用する--regexp-extended必要はありませんが、読みやすくなります)

  • sedエラーの可能性があるファイルを上書きするのではなく、出力でエラーを確認できるように、/オプションなしでコマンドを実行して、コマンドが期待どおりに機能していることを最初に確認することをお勧めします。-i--in-place

関連情報