当前位置:  技术问答>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个空格, 


大家帮忙,满意可以再加分。

|
你试一试,用下面的文件indent.sed作为sed脚本
$ 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

|
楼主用linux的?
man indent一下再说

|
1. 输入文件末尾一行必须是
x01
你可以用这个命令来做
$ cat - >> 
C-aC-dC-d
就是按一下Ctl-a,按两下C-d。

就是要在文件末尾加一个字符,ASCII编码是1,就这个意思。那个cat只是添加的一种办法。这个特殊的符号在后面的sed脚本中有用。

我写的是sed脚本,你不是题目说sed吗?那个脚本做了两件事:
1. 把输入代码有多行变成1行,这样才能用正则表达式处理;
2. 对这一行进行迭代操作,由外到里处理{}。

如果你只是要清理自己的代码,不是学习sed的话,你还是看看其他几位ls的帖子

    
 
 

您可能感兴趣的文章:

 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • sed删除文件中的一行内容的脚本代码
  • 一个文件的一段代码有三行,怎么用sed 替换其中一个值
  • linux下利用(cat,strings,head,sed)命令生成随机字符串
  • pwd|sed 's//cygdrive/([a-z])/1:/' | sed 's///#/g'`\/(pwd代表绝对地址)这个sed又是什么
  • 在循环中使用sed,为什么sed不被执行
  • 请问 ls *.IMG | sed s/.IMG// > cube.lis 中的 | sed s/.IMG// 参数是什么意思?
  • sed n 模式替换中正则表达式获取值问题(sed 高手帮帮忙!!)
  • sed 的简单问题, sed初学, 脚本高手进。先谢了
  • sed变量的用法
  • 求住,sed命令
  • 关于sed脚本,高手快来解答
  • sed问题。。。对高手来说easy。。。
  • 求助:这个sed命令是什么意思?
  • sed linux 这句话什么 意思?
  • shell中的sed引入变量问题
  • 关于sed的正则表达式
  • sed -i 修改文件内容
  • 【sed】简单匹配
  • (急)shell,sed 关于参数的传递
  • | sed 's/^/\ /' > 是啥意思啊
  • 在线等待,用sed命令如何替换整行?
  • 请教sed awk的用法详解,有命令说明的链接也不错,谢谢了
  • sed /awk 字段截取,Help!


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3