Sed命令在找到图案时将其剥离,并将其添加到方形[]之间的以下行中,直到找到新的图案为止
这是我的出发点Sed命令在找到图案时将其剥离,并将其添加到方形[]之间的以下行中,直到找到新的图案为止,sed,strip,Sed,Strip,这是我的出发点 #CHECK THISOUT ------EXAMPLE 1------ ; http://www.idontneed.com Google ; http://www.google.com Yahoo ; http://www.yahoo.com ------EXAMPLE 2------ ; http://idontcare.com Ebay ; http://www.ebay.com Amazon ; http://www.amazon.com 要匹配的模式是带有-----
#CHECK THISOUT
------EXAMPLE 1------ ; http://www.idontneed.com
Google ; http://www.google.com
Yahoo ; http://www.yahoo.com
------EXAMPLE 2------ ; http://idontcare.com
Ebay ; http://www.ebay.com
Amazon ; http://www.amazon.com
要匹配的模式是带有------某物的字符串------
所需输出为:
#CHECK THISOUT
[------EXAMPLE 1------] Google ; http://www.google.com
[------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------] Ebay ; http://www.ebay.com
[------EXAMPLE 2------] Amazon ; http://www.amazon.com
救命啊
perl -ne 'if (/^(------.*------) ;.*/) { $h = $1 }
elsif ($h) { print "[$h] $_" }
else {print}' < input > output
perl-ne'if(/^(---.*-);.*/){$h=$1}
elsif($h){print“[$h]$\}
else{print}'输出
逐行读取输入-n
- 如果一行包含模式,它将存储在
变量中$h
- 如果图案不存在,但之前已设置,则打印时会附加线条
- 否则,打印该行(在满足任何图案之前打印第一行)
perl -ne 'if (/^(------.*------) ;.*/) { $h = $1 }
elsif ($h) { print "[$h] $_" }
else {print}' < input > output
perl-ne'if(/^(---.*-);.*/){$h=$1}
elsif($h){print“[$h]$\}
else{print}'输出
逐行读取输入-n
- 如果一行包含模式,它将存储在
变量中$h
- 如果图案不存在,但之前已设置,则打印时会附加线条
- 否则,打印该行(在满足任何图案之前打印第一行)
- 在
sed中非常容易:
sed -e '/^------..*------/,$ {
/^\(------..*------\).*/ { s//[\1]/; h; d; }
G; s/\(.*\)\n\(\[.*\]\)/\2 \1/
}' data
说明:
- 在找到触发图案之前,正常打印线条;脚本仅在找到第一个模式后更改任何内容。然后脚本的其余部分将运行
- 如果该行是触发器模式,则捕获该模式并将其括在方括号中(
s/../…/
)
- 将图案复制到保留空间(
h
)
- 删除该行并移到下一行
- 这是一条没有触发模式的线
- 将保留空间的内容附加到换行符(
G
)后的模式空间
- 将图案空间拆分为“换行前”和“换行后”,并在(
s/../…/
)之间使用空格重新排序
- 让普通的“在周期结束时打印”打印结果
如果希望在方括号和余数之间有两个空格而不是一个,请在第二个s/../../../
中添加额外的空格
示例输出:
#CHECK THISOUT
[------EXAMPLE 1------] Google ; http://www.google.com
[------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------] Ebay ; http://www.ebay.com
[------EXAMPLE 2------] Amazon ; http://www.amazon.com
在sed中这很容易:
sed -e '/^------..*------/,$ {
/^\(------..*------\).*/ { s//[\1]/; h; d; }
G; s/\(.*\)\n\(\[.*\]\)/\2 \1/
}' data
说明:
- 在找到触发图案之前,正常打印线条;脚本仅在找到第一个模式后更改任何内容。然后脚本的其余部分将运行
- 如果该行是触发器模式,则捕获该模式并将其括在方括号中(
s/../…/
)
- 将图案复制到保留空间(
h
)
- 删除该行并移到下一行
- 这是一条没有触发模式的线
- 将保留空间的内容附加到换行符(
G
)后的模式空间
- 将图案空间拆分为“换行前”和“换行后”,并在(
s/../…/
)之间使用空格重新排序
- 让普通的“在周期结束时打印”打印结果
如果希望在方括号和余数之间有两个空格而不是一个,请在第二个s/../../../
中添加额外的空格
示例输出:
#CHECK THISOUT
[------EXAMPLE 1------] Google ; http://www.google.com
[------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------] Ebay ; http://www.ebay.com
[------EXAMPLE 2------] Amazon ; http://www.amazon.com
awk
解决方案,类似于。使用代码>作为字段分隔符,因此有额外的空间
$ cat ip.txt
#CHECK THISOUT
------EXAMPLE 1------ ; http://www.idontneed.com
Google ; http://www.google.com
Yahoo ; http://www.yahoo.com
------EXAMPLE 2------ ; http://idontcare.com
Ebay ; http://www.ebay.com
Amazon ; http://www.amazon.com
$ awk -F';' '{ if(/^------.*------/){ h = $1 } else if(h){ print "[" h "] " $0 } else {print} }' ip.txt
#CHECK THISOUT
[------EXAMPLE 1------ ] Google ; http://www.google.com
[------EXAMPLE 1------ ] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------ ] Ebay ; http://www.ebay.com
[------EXAMPLE 2------ ] Amazon ; http://www.amazon.com
awk
解决方案,类似于。使用代码>作为字段分隔符,因此有额外的空间
$ cat ip.txt
#CHECK THISOUT
------EXAMPLE 1------ ; http://www.idontneed.com
Google ; http://www.google.com
Yahoo ; http://www.yahoo.com
------EXAMPLE 2------ ; http://idontcare.com
Ebay ; http://www.ebay.com
Amazon ; http://www.amazon.com
$ awk -F';' '{ if(/^------.*------/){ h = $1 } else if(h){ print "[" h "] " $0 } else {print} }' ip.txt
#CHECK THISOUT
[------EXAMPLE 1------ ] Google ; http://www.google.com
[------EXAMPLE 1------ ] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------ ] Ebay ; http://www.ebay.com
[------EXAMPLE 2------ ] Amazon ; http://www.amazon.com
sed是对单个行的简单替换,仅此而已。为了清晰、可移植性、效率、简单性、可增强性、健壮性等,您应该使用awk:
awk 'match($0,/-{5}.+-{5}/,a){ v="["a[0]"] "; next } {print v $0}' file
#CHECK THISOUT
[------EXAMPLE 1------] Google ; http://www.google.com
[------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------] Ebay ; http://www.ebay.com
[------EXAMPLE 2------] Amazon ; http://www.amazon.com
上面使用GNU awk作为第三个参数来匹配(),其他awk应该是:
$ awk 'match($0,/-{5}.+-{5}/){ v="["substr($0,RSTART,RLENGTH)"] "; next } {print v $0}' file
#CHECK THISOUT
[------EXAMPLE 1------] Google ; http://www.google.com
[------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------] Ebay ; http://www.ebay.com
[------EXAMPLE 2------] Amazon ; http://www.amazon.com
sed是对单个行的简单替换,仅此而已。为了清晰、可移植性、效率、简单性、可增强性、健壮性等,您应该使用awk:
awk 'match($0,/-{5}.+-{5}/,a){ v="["a[0]"] "; next } {print v $0}' file
#CHECK THISOUT
[------EXAMPLE 1------] Google ; http://www.google.com
[------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------] Ebay ; http://www.ebay.com
[------EXAMPLE 2------] Amazon ; http://www.amazon.com
上面使用GNU awk作为第三个参数来匹配(),其他awk应该是:
$ awk 'match($0,/-{5}.+-{5}/){ v="["substr($0,RSTART,RLENGTH)"] "; next } {print v $0}' file
#CHECK THISOUT
[------EXAMPLE 1------] Google ; http://www.google.com
[------EXAMPLE 1------] Yahoo ; http://www.yahoo.com
[------EXAMPLE 2------] Ebay ; http://www.ebay.com
[------EXAMPLE 2------] Amazon ; http://www.amazon.com
替换文本是否始终位于行的开头?它的简单程度有很大的不同。总是在开头,替换文本总是在行的开头吗?这对它的容易程度有很大的影响。总是在一开始,thanks@Francesco:是否存在awk
是用法:awk[OPTIONS][awk_PROGRAM][FILE]-v VAR=VAL设置变量-F SEP使用SEP作为字段分隔符-F文件读取程序FILE@Francesco:是否存在awk
是用法:awk[OPTIONS][awk_PROGRAM][FILE]-v VAR=VAL Set变量-F SEP使用SEP作为字段分隔符-F FILE从文件读取程序