当前位置: 技术问答>linux和unix
sed 实现代码缩进,可以加分。
来源: 互联网 发布时间:2016-06-26
本文导语: 如何实现最近的一组大括号之间的代码缩进,即 括号1 括号2 括号3 。。。。 括号3 括号2 括号1 括号3之间的缩进4个空格,括号2之间的缩进4个空格,括号1之间缩进4个空格, 大家帮忙,满意可以再加分。 ...
如何实现最近的一组大括号之间的代码缩进,即
括号1
括号2
括号3
。。。。
括号3
括号2
括号1
括号3之间的缩进4个空格,括号2之间的缩进4个空格,括号1之间缩进4个空格,
大家帮忙,满意可以再加分。
括号1
括号2
括号3
。。。。
括号3
括号2
括号1
括号3之间的缩进4个空格,括号2之间的缩进4个空格,括号1之间缩进4个空格,
大家帮忙,满意可以再加分。
|
你试一试,用下面的文件indent.sed作为sed脚本
$ sed -n -f indent.sed
现在有几个限制:
1. 输入文件末尾一行必须是
x01
你可以用这个命令来做
$ cat - >>
C-aC-dC-d
就是按一下Ctl-a,按两下C-d。
2. 结果文件的会在文件开头多出一个空行。
3. 我假设括号是{和},所以只处理这个括号,其它你可以自己改。目前要求这个括号不要和代码混在一起,对号单独成行,否则虽然也能跑,但可能不满足你的要求。另外,如果括号放在注释或者引号或者转义符里,这我就没管了。这需要另外的工作了。
$ sed -n -f indent.sed
现在有几个限制:
1. 输入文件末尾一行必须是
x01
你可以用这个命令来做
$ cat - >>
C-aC-dC-d
就是按一下Ctl-a,按两下C-d。
2. 结果文件的会在文件开头多出一个空行。
3. 我假设括号是{和},所以只处理这个括号,其它你可以自己改。目前要求这个括号不要和代码混在一起,对号单独成行,否则虽然也能跑,但可能不满足你的要求。另外,如果括号放在注释或者引号或者转义符里,这我就没管了。这需要另外的工作了。
#indent.sed
#!/bin/sed -n -f
#Note:
# 1. To make sure the input file has a x01 in the end of it.
# 2. The result file will be added a blank line at the head.
# 3. The input file should not mixing { and } with other codes. This can be improve,
# but I have not more time now :-).
#
# CHAR MEANING
# x01 EOF
# x02 newline
# x03 {
# x04 }
# x05 A flag notes the merging history of hold space and pattern space.
# Merge all code lines, exclude EOF line, into one line
/^x01$/!{
# del leading and trailing spaces
y/t/ /
s/^ *//
s/ *$//
# Merge the preceding lines with current
H
x
# avoiding confusing with the ones added when append to hold space
s/n/x02/
# restore to hold space
x
}
# When have read all the code lines
/^x01$/{
# get contents from the hold space.
x
# Iteration to parse the { and }
:a
# replace the hold space with the pattern space.
h
# 1{2}3 -> 13
s/^([^{}]*){(.*)}([^{}]*)$/1x053/
# If none {}, break
Tb
# Indent the {2}
x
s/^([^{}]*){(.*)}([^{}]*)$/ x032x04/
s/x02/x02 /g
# Append to hold space, get 13{2}
H
x
y/n/x05/
x
# Write 13{2} back to pattern space
g
# 13{2} -> 1{2}3
s/^(.*)x05(.*)x05(.*)$/132/
# continue
ta
:b
# Add missing 4 blank space for codes, excluding { and } line. Also,
# s/x02([ ]*)([a-zA-Z0-9]+)/n 12/g
#can do the same work. But I have no idea about their difference.
:c
s/x02([ ]*)([a-zA-Z0-9]+)/n 12/
tc
# Restore the special characters to their origin
y/x03/{/
y/x04/}/
y/x02/n/
s/x01//
p
}
|
大括号内的话在vim里使光标指向其中的一个大括号,然后进在命令模式输入%=%
|
vim里的话:
:1, $ ! indent
:1, $ ! indent
|
楼主用linux的?
man indent一下再说
man indent一下再说
|
1. 输入文件末尾一行必须是
x01
你可以用这个命令来做
$ cat - >>
C-aC-dC-d
就是按一下Ctl-a,按两下C-d。
就是要在文件末尾加一个字符,ASCII编码是1,就这个意思。那个cat只是添加的一种办法。这个特殊的符号在后面的sed脚本中有用。
我写的是sed脚本,你不是题目说sed吗?那个脚本做了两件事:
1. 把输入代码有多行变成1行,这样才能用正则表达式处理;
2. 对这一行进行迭代操作,由外到里处理{}。
如果你只是要清理自己的代码,不是学习sed的话,你还是看看其他几位ls的帖子
x01
你可以用这个命令来做
$ cat - >>
C-aC-dC-d
就是按一下Ctl-a,按两下C-d。
就是要在文件末尾加一个字符,ASCII编码是1,就这个意思。那个cat只是添加的一种办法。这个特殊的符号在后面的sed脚本中有用。
我写的是sed脚本,你不是题目说sed吗?那个脚本做了两件事:
1. 把输入代码有多行变成1行,这样才能用正则表达式处理;
2. 对这一行进行迭代操作,由外到里处理{}。
如果你只是要清理自己的代码,不是学习sed的话,你还是看看其他几位ls的帖子
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。