如何使用regexp match(bash脚本)将文件中的指定行移动到其他位置?

如何使用regexp match(bash脚本)将文件中的指定行移动到其他位置?,regex,string,bash,Regex,String,Bash,好的,文件内容: asdasd0 **asdasd1** asdasd2 asdasd3 asdasd4 **asdasd5** asdasd6 我想将“^asdasd5”正则表达式匹配行移到“^asdasd1”正则表达式匹配行之前: asdasd0 **asdasd5** **asdasd1** asdasd2 asdasd3 asdasd4 asdasd6 怎么做 感谢您使用perl单向操作: s/^(asdasd1.*)(^asdasd5(?:\n|$))/$2$1/sm 举个例子。

好的,文件内容:

asdasd0
**asdasd1**
asdasd2
asdasd3
asdasd4
**asdasd5**
asdasd6
我想将“^asdasd5”正则表达式匹配行移到“^asdasd1”正则表达式匹配行之前:

asdasd0
**asdasd5**
**asdasd1**
asdasd2
asdasd3
asdasd4
asdasd6
怎么做


感谢您使用
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
具有以下输出:

asdasd0
asdasd5
asdasd1
asdasd2
asdasd3
asdasd4
asdasd6

使用
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
具有以下输出:

asdasd0
asdasd5
asdasd1
asdasd2
asdasd3
asdasd4
asdasd6

这可能适合您:

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

这可能适合您:

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

使用sed的命令“i”在模式之前插入。
请参见使用sed的命令“i”在模式之前插入。
请参见

不清楚您的模式是什么-什么是常量,什么是变化的

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

不清楚你的模式是什么——什么是不变的,什么是变化的

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

因为这是面向行的,所以不需要正则表达式。当看到起始线时,开始捕捉线。当看到结束行时,打印它,打印捕获的行,然后打印文件的其余部分:

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

这里有一种使用
ex
的方法:

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

这里有一种使用
ex
的方法:

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

最简单的方法是使用简单的awk双通道算法:

awk '(NR==FNR) { if ($0 ~ /asdasd5/) t=$0; next }
     /asdasd5/ { next }
     /asdasd1/ { print t }
     1' file file

最简单的方法是使用简单的awk双通道算法:

awk '(NR==FNR) { if ($0 ~ /asdasd5/) t=$0; next }
     /asdasd5/ { next }
     /asdasd1/ { print t }
     1' file file

这显然不是你真正想做的。你不应该把你的例子“哑巴”到任何你能得到的答案都不能与你的真实数据一起工作的地步。请说明您的实际需求是什么(以及您已经尝试过的方法)。我认为这个问题没有经过很好的编辑,因为粗体在代码标记中不起作用。我没有修好,因为我不确定。你自己动手做以避免混淆。这显然不是你真正想做的。你不应该把你的例子“哑巴”到任何你能得到的答案都不能与你的真实数据一起工作的地步。请说明您的实际需求是什么(以及您已经尝试过的方法)。我认为这个问题没有经过很好的编辑,因为粗体在代码标记中不起作用。我没有修好,因为我不确定。自己动手做,避免混淆。