1

OK、ファイルの内容:

asdasd0
**asdasd1**
asdasd2
asdasd3
asdasd4
**asdasd5**
asdasd6

「^asdasd5」正規表現一致行を「^asdasd1」正規表現一致行の前に移動したい:

asdasd0
**asdasd5**
**asdasd1**
asdasd2
asdasd3
asdasd4
asdasd6

方法?

ありがとう

4

7 に答える 7

2

あなたのパターンが何であるかは明確ではありません-何が一定で、何が変化していますか。

sed "/.*5/d;/.*1/i"$(sed -n '/.*5/p' FILE)  FILE

5 を含む行を削除し、1 を含む行の後ろにその行を挿入します。

ファイルは彼自身の参照であるため、ここで -i を使用することはできません。

sed "/.*5/d;/.*1/i"$(sed -n '/.*5/p' FILE)  FILE > FILE.tmp 
mv FILE.tmp FILE
于 2012-05-08T14:29:07.380 に答える
2

を使用してそれを行う方法は次のexとおりです。

ex inputfile <<'EOF'
/^asdasd5
d
/^asdasd1
-
put
wq
EOF

すべて1行で同じこと:

printf '%s\n' '/^asdasd5' 'd' '/^asdasd1' '-' 'put' 'wq' | ex inputfile
于 2012-05-08T15:37:40.687 に答える
1

を使用した片道perl

s/^(asdasd1.*)(^asdasd5(?:\n|$))/$2$1/sm

例。の内容script.pl:

use warnings;
use strict;

my $data;

## Read all DATA content into $data variable.
do { 
    $/ = undef;
    $data = <DATA>;
};

## Last 's' flag lets '.*' match newlines.
## 'm' flag lets '^' and '$' match at the beginning or end of each line.
$data =~ s/^(asdasd1.*)(^asdasd5(?:\n|$))/$2$1/sm;

print $data;

__DATA__
asdasd0
asdasd1
asdasd2
asdasd3
asdasd4
asdasd5
asdasd6

次のように実行します。

perl script.pl

次の出力で:

asdasd0
asdasd5
asdasd1
asdasd2
asdasd3
asdasd4
asdasd6
于 2012-05-08T14:03:37.203 に答える
1

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

sed '/asdasd1/,/asdasd5/{/asdasd5/{G;b};/asdasd1/{h;d};H;d}' file
于 2012-05-08T14:16:51.717 に答える
1

これは行指向なので、正規表現は必要ありません。スタート ラインが表示されたら、ラインのキャプチャを開始します。終了行が表示されたら、それを印刷し、キャプチャされた行を印刷してから、ファイルの残りを印刷します。

awk -v start=asdasd1 -v end=asdasd5 '
    match($0,start) {capture=1}
    match($0,end)   {print $0 captured; capture=0; next}
    capture         {captured = captured RS $0; next}
    1
'
于 2012-05-08T15:04:02.867 に答える
0

これを行う最も簡単な方法は、単純な awk ダブルパス アルゴリズムです。

awk '(NR==FNR) { if ($0 ~ /asdasd5/) t=$0; next }
     /asdasd5/ { next }
     /asdasd1/ { print t }
     1' file file
于 2019-03-13T17:43:55.390 に答える
-1

sed のコマンド 'i' を使用して、パターンの前に挿入します。http://www.grymoire.com/Unix/Sed.html#uh-41を参照してください。

于 2012-05-08T14:26:04.247 に答える