2009-08-03 9 views
14

を置き換える:基本的に「// < < >>の間に線を見つけようとイムsedの複数行これが私のサンプルテキストファイルです

 
asdas 

this should be there 

:iとしては、O/Pをしたい

いる

 
asdas 
//<<<TAG 
this should be removed 
//TAG>>> 
this should be there 
//<<<TAG 
T 
> 
asd 
asd 
//TAG>>> 
"(これらの行も含めて)削除してください。

Iは -n sedのSED

使用してみました '; 1 H;!1Hを$ {; G; S /// < <] * TAG >>> // G; P;} < test.txt

しかし、どのように正しく出力されなかったか。 ">"記号を含む2番目のタグは正規表現に失敗しました。どこが間違っているのかわからない?

どうすればいいですか?

+0

は、あなたがasdasと「これがあるはず」の間に空白行をよろしいですか? –

答えて

10

リテラルテキスト「タグ」との行を削除しようとしている場合は、試してみてください。

 
sed '/^\/\/<</,/^\/\/.*>>/d' 

 
sed '/\/\/<<<TAG/,/\/\/TAG>>>/d' 

をあなたのコメントから、そのタグが、その場合には、リテラルではないかもしれない表示されます

これは異なる区切り文字を使用することによって簡略化することができる。

+4

Google検索の「sed one-liners」はよく役立ちます。http://sed.sourceforge.net/sed1line.txtは最初の結果の1つであり、他にも多く含まれています。 – Cascabel

3
sed '@^//<<<@,@^//.*>>>@d' 

よりもむしろSEDを使用して私が与えたソリューション、あなたはPerlとのawkにこれらのいずれかを好むかもしれない:私はあなたが本当にTAGは一定ではしたくないと思うことを、私は知っているきれいな解決策は、perlの変異体である与えられた

 
perl -ne 'print if !([email protected]//<<<[email protected] .. [email protected]//TAG>>>@)' 
awk '/\/\/<<<TAG/,/\/\/TAG>>>/ {next} 1' 

 
perl -ne 'print if !([email protected]^//<<<(.*)@ .. [email protected]^//$1>>>[email protected])' 
0

またsedの検索区切り文字が最初のデリミタをエスケープすることによって変更することができる。

sed '\|^//<<<|,\|^//.*>>>|d' file 

awkのバージョンが一致同じタグ名を持つエンド:あなたの出力で

awk -F'//<<<|//|>>>' '$2{p=$2; while(getline && p!=$2); next}1' file 
+0

が試用されます... – rbawaskar

関連する問題