0

すべての .x ファイルで 2 つの単語の間のテキストを削除したいのですが、試してみました:

find temp -type d | while read DIRNAME
do
    sed -i '/abcd1/,/abcd2/d' ~/Desktop/$DIRNAME/.x
done

問題は、これが最初に発生したものだけを削除したいということですが、

sed -i '0,/abcd1/,/abcd2/d' ~/Desktop/$DIRNAME/.x

動作しません。

4

3 に答える 3

1

一方通行:

sed -e '/3/,/6/ { /6/ ba ; d }; b ; :a ; $! { N ; ba }; s/[^\n]*\n//'

それを説明するために編集

/3/,/6/         # Range between line that matches '3' and other line that matches '6'.
{
  /6/ ba        # When matches last line of the range, goto label 'a'.
  d             # Delete each line in the range.
}
b               # This command will be executed in lines until first match in the 
                # range. It prints the line and begin loop reading next one.
:a              # Label 'a'.
$!              # While not found last line ...
{ 
  N             # Append next line to current pattern space.
  ba            # Go to label 'a'. Enter a loop reading each line until last one.
}
s/[^\n]*\n//    # Remove until first '\n' (content of last line of the range) and print 
                # the rest.

テスト:_

内容infile

1
2
3
4
5
6
7
1
2
3
4
5
6
7

次のように実行します。

sed -e '/3/,/6/ { /6/ ba ; d }; b ; :a ; $! { N ; ba }; s/[^\n]*\n//' infile

出力(「3」と「6」の間の行を1回だけ削除します):

1
2
7
1
2
3
4
5
6
7
于 2012-04-25T13:47:57.317 に答える
1
sed -ie 'bb; :a q; :b s/from/into/; ta' test.txt
  • bb;— マークに分岐しbます (uit コマンドをスキップしqます);
  • :a q;— uit コマンドaでマークします。q
  • :b s/from/intob置換マークを付けます。
  • taa—置換が成功した場合、マークにジャンプします。
  • ;— sed のコマンド区切り文字。

それが役に立てば幸い。

于 2012-04-25T13:43:53.117 に答える
0

これはあなたのために働くかもしれません:

sed '/word1/!b;:a;/word1.*word2/{s///;tb};$!{N;ba};:b;$!{n;bb}' file

上記は単語に対して機能し、行のブロックに対しては次を使用します。

sed '/block1/,$!b;x;/./{x;b};x;/block1/,/block2/{/block2/h;d}' file

編集:

を削除するにはfirst occurence, only if there are more than one occurrences:

 sed '/word1/!b;:a;/\(word1\).*\(word2\)\(.*\1.*\2\)/{s//\3/;tb};$!{N;ba};:b;$!{n;bb}' file
于 2012-04-26T06:45:41.150 に答える