テキストファイルにコメントがない場合にのみ、これを置き換えるために正規表現を使用してsedコマンドを生成しようとしていますが、sedコマンドについて知っていることがほとんどないため、問題が発生します。
問題の小さな部分に対する解決策が見つかりましたが、一部は不十分であるか、1つに統合できませんでした。TL;DR バージョンは最後に提供されます。
まず、私の究極の目標を決める必要があります。
テキストファイルのすべての項目と一致させたい(通常の正規表現(ヘヘ))。いいえコメントしました。複数の言語でこれを実行したいので、一般的なCコメントのみを使用します。
したがって、この場合、単語や行にさまざまな方法で注釈を付けることができます。次の内容についてのみコメントでき、コメントブロックも//
あります。/* */
環境
私は現在POSIX sedだけをサポートしているMac OSXを使用していますが、GNU-sedをインストールしましたが、より良いようです。(ありがとうHomebrew
。gnu-sed
gsed
私はGNU-sedを使用していると仮定してこの記事を書いています。
事件を無視する
最初の質問は、特定の状況を無視する方法です。簡単だと思いました。このトピック。
今、この//
部分は私にとって簡単なようです。または(|
)条件は他の条件と組み合わせられます。
次のようになります。
sed -E "/\/\/.*/! s/foo/bar/" file
したがって、入力ファイルが次のような場合:
foo
42
test
//foo
//42
// foo
//something foo
foo
42
something foo
foo
出力は次のとおりです
bar
42
test
//foo
//42
// foo
//something foo
bar
42
something bar
bar
/* */
だから今はコメントセクションに私の考えを集中したいと思います。
複数行にわたって一致
2番目の質問は、正規表現を複数行で一致させる方法です。まあ、私の考えはそれが最大の問題だと思います。私が見つけたこのトピック改行文字でのみ一致させる方法について話し合います。まあ、それがどのように機能するのかを調べるのに時間がかかりました。しかし、この部分の解決策は私に新しい問題と新しい質問を与えました。
明らかに、新しい行(\n
)のみを無視できます。だから今同じことをしたいのですが、行数は不明です(0から無限大(*
)まで)。行を繰り返す必要があるようですが、sedのコマンドについて何も知らず、これが本当に厄介なので、ここで詰まってしまいます。
検索して一つのことを見つけました。小さなスクリプト目的はtail
コマンドを置き換えることであり、ループを使用しますが(おそらく)それが何をしているのか理解できません。
*/
その部分の前にのみ一致させてください。
3番目の部分は、無視された大文字と小文字がコメントブロックの終わり(*/
)の前にあるものとのみ一致することを確認することです。したがって、最終的に大文字と小文字を無視すると、間/*
のすべての項目とのみ一致します*/
。最後のコマンドは、コメントブロックに書き込まれた内容を完全に無視します。
私がこの部分について実際の検索をしていない理由は以前のことを扱っておらず、この質問は以前の質問にかかっているよう*/
です。/*
最後の部分:すべてを一つにまとめる
まあ、明らかに私はこの時点で完全な失敗者です。
長い話を短く
私の質問は:コメントなしでテキストファイルで何をしたいのかを変更するsedコマンドは何ですか?
付録
他の言語を使うより簡単な方法を知っていれば、それも非常に歓迎されます。したがって、これを行う方法や他の方法を知っている場合は、awk
いつでもpython
共有してください。
答え1
彼らが不可能だと言ったら、信じてはいけません。あなたしなければならないしかし、彼らがあなたに話したら信じてください。簡単ではありません。
sed '\|*/|!{ s|/\*|\n&| #if ! */ repl 1st /* w/ \n/*
h; s|foo|bar|g;/\n/!b #hold; repl all foo/bar; if ! \n branch
G; s|\n.*\n||;:n #Get; clear difference; :new label
n; \|*/|!bn;s|^|\n/*| #new line; if ! */ branch new label
};s|*/|\n&|g #repl all */ w/ \n*/
s|foo|&\nbar|g;:r #repl all foo w/ foo\nbar
s|\(/\*[^\n]*\)\nbar|\1|g;tr #repl all /*[^\n]*\nbar w/ foo
s|foo\n\(b\)|\1|g #repl all foo\nbar w/ bar
s|^\n/.||;s|\n||g #clear any \n inserts
' <<\INPUT
asfoo /* asdfooasdfoo
asdfasdfoo
asdfasdfoo
foo */foo /*foo*/ foo
/*.
foo*/
foo
hello
INPUT
出力
asbar /* asdfooasdfoo
asdfasdfoo
asdfasdfoo
foo */bar /*foo*/ bar
/*.
foo*/
bar
hello