OK、ファイルの内容:
asdasd0
**asdasd1**
asdasd2
asdasd3
asdasd4
**asdasd5**
asdasd6
「^asdasd5」正規表現一致行を「^asdasd1」正規表現一致行の前に移動したい:
asdasd0
**asdasd5**
**asdasd1**
asdasd2
asdasd3
asdasd4
asdasd6
方法?
ありがとう
あなたのパターンが何であるかは明確ではありません-何が一定で、何が変化していますか。
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
を使用してそれを行う方法は次のex
とおりです。
ex inputfile <<'EOF'
/^asdasd5
d
/^asdasd1
-
put
wq
EOF
すべて1行で同じこと:
printf '%s\n' '/^asdasd5' 'd' '/^asdasd1' '-' 'put' 'wq' | ex inputfile
を使用した片道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
これはあなたのために働くかもしれません:
sed '/asdasd1/,/asdasd5/{/asdasd5/{G;b};/asdasd1/{h;d};H;d}' file
これは行指向なので、正規表現は必要ありません。スタート ラインが表示されたら、ラインのキャプチャを開始します。終了行が表示されたら、それを印刷し、キャプチャされた行を印刷してから、ファイルの残りを印刷します。
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
'
これを行う最も簡単な方法は、単純な awk ダブルパス アルゴリズムです。
awk '(NR==FNR) { if ($0 ~ /asdasd5/) t=$0; next }
/asdasd5/ { next }
/asdasd1/ { print t }
1' file file
sed のコマンド 'i' を使用して、パターンの前に挿入します。http://www.grymoire.com/Unix/Sed.html#uh-41を参照してください。