代替文字列の使用に関する他のいくつかの質問を調べましたが、sed
特定の要件にそれを適用する方法はわかりません。
以下のコードスニペットのような場合は、「#」で始まらない行の文字列のみを変更したいと思います。
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="string"
PKG_DESC="string-foo"
出力が次のようになります。
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="newString"
PKG_DESC="newString-foo"
私が収集した情報によると、findとsedを使用してすべてのファイルのすべての文字列を変更できると思います。
find . -type f -exec sed -i 's/string/newString/g' {} +
しかし、「#」で始まる行に例外を追加する方法はわかりません。私はsedの他に他の方法も開いているので、もっと簡単な方法があれば自由に共有してください。
読んだ後複数のパターンに一致するsedの行だけを変更する方法は?、行が特定のパターンで始まると文字列を変更する方法を学びましたが、必要なのはパターンのある行を変更することです。いいえ確立された。
答え1
sed
感嘆符付きのパターンを見つけたら、実行を停止できます。
sed '/#/!s/string/replacement/' file
つまり、「#」(どこでも)と一致する行では置換は行われません。それ以外の場合は交換が行われます。あなたの場合、結果は次のとおりです。
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="replacement"
PKG_DESC="replacement-foo"
ハッシュで始まる行だけをスキップするには、正規表現を次のように変更します。
sed '/^#/!s/string/replacement/' file
最後にコメントがある行にはコメントセクションにも変更が適用されますが、上記の例ではこれらの行はまったく変更されません(コードセクションを含む)。
答え2
#
文字のないこの行の「文字列」を変更したいと思います。またはこの文字は「文字列」の後にあるので、行の末尾にコメントを追加できます。
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="string"
PKG_DESC="string-foo"
PKG_A="string" # this is comment after string
正しい操作のために
sed 's/^\([^#]*\)string/\1newString/' file
結果:
#####################################
# Blah blah blah string blah blah
#####################################
PKG_NAME="newString"
PKG_DESC="newString-foo"
PKG_A="newString" # this is comment after string