将单行拆分为多行,直到与特定模式匹配

将单行拆分为多行,直到与特定模式匹配

我试图将每一行数据拆分为c1.txt多行并将其复制到新文件,c2.txt如预期结果集中所示。但最终两者之间没有区别,c1.txt并且c2.txt两个文件的行数仍然相同two

c1.txt

# file: /home/mytest/data # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- default:user::rwx default:group::r-x default:group:smr:rwx default:group:agm:r-x default:mask::rwx default:other::---
# file: /home/mytest/datasr123 # owner: own # group: group-sm user::r-x group::rwx mask::rwx other::--- 

代码

awk -v dt="file :" '$0 ~ dt {gsub(dt, "\n"dt)}1' c1.txt > c2.txt

预期结果

# file: /home/mytest/data 
# owner: own 
# group: group-sm 
user::r-x 
group::rwx 
mask::rwx 
other::--- 
default:user::rwx 
default:group::r-x 
default:group:smr:rwx 
default:group:agm:r-x 
default:mask::rwx 
default:other::---

# file: /home/mytest/datasr123 
# owner: own 
# group: group-sm 
user::r-x 
group::rwx 
mask::rwx 
other::--- 

答案1

使用sed,我们可以这样做:

sed -E ':j s/ ([^ ]*)$/\n\1/; t j;' infile \
| sed -E ':j /(:|#)$/ { N; s/\n/ /;t j; }'

第一个sed命令是在从行尾开始看到的每个空格上分解该行;

第二个命令连接回以 a或sed结尾的那些行。#:

答案2

替代awk

awk '{ for (i=1; i<=NF; i++) if ($i ~ "[#:]$" ) printf $i" "; else  print $i; }' c1.txt

还有一种sed变体,尽管更脆弱

sed -E "s/([^:#]) ([#a-z])/\1\n\2/g" c1.txt

答案3

使用 GNU awk for FPAT 并假设,就像您发布的示例输入一样,您的实际输入在文件名中没有空格等:

$ awk -v FPAT='(#\\s+\\S+:\\s+)?\\S+' '{for (i=1; i<=NF; i++) print $i; print ""}' file
# file: /home/mytest/data
# owner: own
# group: group-sm
user::r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:smr:rwx
default:group:agm:r-x
default:mask::rwx
default:other::---

# file: /home/mytest/datasr123
# owner: own
# group: group-sm
user::r-x
group::rwx
mask::rwx
other::---

答案4

对我来说效果很好

for ((i=1;i<=2;i++)); do sed -n ''$i'p' filename |sed "s/#/\n#/g" |sed '/^$/d'| sed "3s/ /\n/3g";echo " "| sed "s/.*/&\n/g"; done

输出

# file: /home/mytest/data 
# owner: own 
# group: group-sm
user::r-x
group::rwx
mask::rwx
other::---
default:user::rwx
default:group::r-x
default:group:smr:rwx
default:group:agm:r-x
default:mask::rwx
default:other::---


# file: /home/mytest/datasr123 
# owner: own 
# group: group-sm
user::r-x
group::rwx
mask::rwx
other::---

相关内容