2012-05-08 8 views
1

OK、ファイルの内容:ファイル内の指定行をregexp match(bashスクリプト)を使って他の場所に移動するには?

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

HOWTO:

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

私は "^ asdasd1" 正規表現マッチした行の前に "^ asdasd5" 正規表現マッチした行を移動したいですか?

おかげperlを使用して

+0

これは明らかにあなたが本当にやりたいことではありません。あなたが得ることができる答えがあなたの実際のデータではうまくいかないところまで、あなたの例を "ダムダウン"してはいけません。あなたの実際の要件が何であるか(そしてあなたがすでに試みたアプローチも)を示してください。 –

+0

太字はコードタグ内では機能しないので、質問はうまく編集されていないと思います。私は確信していないので、私はそれを修正しませんでした。混乱を避けるために自分でやってください。 – Birei

答えて

2

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

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

私は5を含む行を削除して、ファイルが自分の基準であるため、あなたは、ここに-iで動作することはできません1.

を含む行の後ろにその行を挿入します。

sed "/.*5/d;/.*1/i"$(sed -n '/.*5/p' FILE) FILE > FILE.tmp 
mv FILE.tmp FILE 
+0

それは素晴らしいです! – GioMac

1

一つの方法:

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 

実行それが好き:

asdasd0 
asdasd5 
asdasd1 
asdasd2 
asdasd3 
asdasd4 
asdasd6 
+0

ありがとう、よく働いた!他のソリューションを見てみましょう... – GioMac

1

これはあなたのために働くかもしれない:

sed '/asdasd1/,/asdasd5/{/asdasd5/{G;b};/asdasd1/{h;d};H;d}' file 
+0

ありがとうございますが、同じ出力を得ました – GioMac

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 
' 
2

ここexを使用してそれを行うための方法です:

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

同じことすべて1行に:

printf '%s\n' '/^asdasd5' 'd' '/^asdasd1' '-' 'put' 'wq' | ex inputfile 
関連する問題