我有一系列文本文件,每个文件文件在文件的不同部分包含两次字符串“Address”,后来又包含字符串“Subscriber Address”,总共出现三次“Address”。使用sed,我想在每个文件中的第一个实例“地址”之后立即收集数据,而忽略其余部分。有时,完整地址将显示在两行中,如下所示......
Address
100 MAIN ST
STRATFORD CT 06614
有时地址线将换行,将City,State和ZIP移动到第三行,如下所示......
Address
NO 10 GREEN ACRES
LANE
SHELTON CT 06484
我想将输出存储在变量中:Address1,Address2,City,State和Zip。使用上面的每个例子,期望的结果将是......
Address1=100 MAIN ST
City=STRATFORD
State=CT
Zip=06614
Address1=NO 10 GREEN ACRES
Address2=LANE
City=SHELTON
State=CT
Zip=06484
第二个例子中一个合适的替代方案是连接地址行1和2,结果如下......
Address1=NO 10 GREEN ACRES LANE
City=SHELTON
State=CT
Zip=06484
我知道这要问很多。非常感谢任何帮助。
答案 0 :(得分:0)
Sed并非用于此目的。 Sed仅在单行上运行,不保留历史记录等。
你可以切换到例如一个AWK克隆(awk,gawk,nawk)。
答案 1 :(得分:0)
我试图这样做:
$ cat file
test
First Address
100 MAIN ST STRATFORD CT 06614
test
Second Address
100 MAIN ST
STRATFORD CT 06614
test
Third Address
NO 10 GREEN ACRES
LANE
SHELTON CT 06484
test
$ sed -n '/Address/{:start;N;/[^0-9]$/b start;s/\n/|/g;p}' file |
sed 1d |
sed 's/^Address|//;s| \([0-9]\+\)$|\nZip: \1|' |
sed 's| \([A-Z]\+\)$|\nState: \1|'|
sed 's/|\([^|]\+\)$/\nCity: \1/' |
sed '/^[^:]\+$/s|\(.*\)|Address: \1|;s/|/ /g'
Address: Second Address 100 MAIN ST
City: STRATFORD
State: CT
Zip: 06614
Address: Third Address NO 10 GREEN ACRES LANE
City: SHELTON
State: CT
Zip: 06484
(我不解释它是如何起作用的: - ))
P.S。这个loong命令背后的想法是将文件转换为仅有adressed的行,之后我们删除第1行并继续其他行。通过使用正则表达式,我们将每个地址转换为所需的格式。
答案 2 :(得分:0)
sed -ne '/./{H;$!d;}' -e 'x;/Address/,/^$/!d' -e 's/\n/#/g;s/#Address#//' -e 's/\(.*\)#\(.*\)#\(.*\)/Address1=\1\nAddress2=\2\n\3\n/;s/\(.*\)#\(.*\)/Address1=\1\n\2\n/;s/\([a-Z]*\)\s\([a-Z][a-Z]\)\s\([0-9]\{5\}\)/City=\1\nState=\2\nZip=\3/p' addr.txt
这会使地址变平并格式化,然后您只需要将它们统一起来