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