我有一个包含大行的文件。这些行应在两个字符之后分成单独的行,并且新行应在开头添加//。
我有什么:
MEANDER_XY
MEANDER_WS
需要什么:
ME
//AN
//DE
//R_X
//Y
ME
//AN
//DE
//R_W
//S
我用过sed -e 's/.\{2\}/&\n/g'
。该行被分割了,但我还需要添加//
,如图所示。
答案 0 :(得分:1)
这可能对您有用(GNU sed):
sed 's/[A-Z]_\?[A-Z]/&\n\/\//g' file
在全局范围内匹配一个大写A到Z,然后是一个可选的下划线,再匹配另一个大写A到Z,并由其自身替换,然后换行,然后是两个反斜杠。
答案 1 :(得分:0)
请尝试按照给定的示例进行测试。
awk '
{
count=""
while($0){
if(match($0,/[a-zA-Z][^a-zA-Z]*[a-zA-Z]/)){
value=substr($0,RSTART,RLENGTH)
if(++count>1){
print "//"value
}
else{
print value
}
$0=substr($0,RSTART+RLENGTH)
}
else{
if(length($0)){
print "//" $0
next
}
}
}
}' Input_file
答案 2 :(得分:0)
使用GNU awk,您可以使用FPAT
按照字段的模式定义字段(请参见here)。您声明:
在两个字符之后,这些行应划分为单独的行,并且新行应在开头添加//。
但是您的输出假定为两个字母字符。您追求的模式是:
FPAT=""[^[:alpha:]]*[[:alpha:]][^[:alpha:]]*[[:alpha:]]?"
它最多搜索一个或两个字母字符,这些字母可以先于或与非字母字符交织。 (未结束):
MEANDER_XY -> ME\n//AN\n//DE\n//R_X\n//Y
MEANDERS_XY -> ME\n//AN\n//DE\n//RS\n//_XY
因此,以下awk可以解决问题:
awk 'BEGIN{FPAT=""[^[:alpha:]]*[[:alpha:]][^[:alpha:]]*[[:alpha:]]?"; OFS="\n//"}{$1=$1}1'
使用POSIX awk,您可以制作将始终有效的扩展版本:
awk 'BEGIN{regex=""[^[:alpha:]]*[[:alpha:]][^[:alpha:]]*[[:alpha:]]"; OFS="\n//"}
{ s=$0
while(match(s,regex)) {
printf substr(s,RSTART,RLENGTH) (length(s)==RLENGTH ? "": OFS)
s=substr(s,RLENGTH+1)
}
print s
}'