sed+grep命令对所有文件进行替换

有一种需求,叫做对jar包反编译出源码方便查看。

Java Decompiler是个非常不错的工具

ubantu系统下载deb包,使用 dpkg -i 包名       进行安装。安装完成后在/opt/jd-gui文件夹就是安装好之后的目录。

jd-tui文件夹下有个文件jd-gui.desktop文件,拷贝到桌面之后,双击,信任,之后可以打开界面。

添加jar包之后就可以反编译出.java格式的java源码,还可以将源码另存到一个zip文件中,解压之后就有对应的包名和对应的java文件。

但是,某一个java文件可能是下图这样的:

更有甚者,会有很多类似空行

每个反编译出来的java源文件末尾还有类似签名

 

所以现在的目标是讲/*     */ 去除。"*" 和 "/" 都需要前面使用反斜杠"\"进行转义。在空格的前面不需要进行转义。

使用sed -i命令可以解决这个问题。

如果在vim中进行替换:,则只可以一次操作一个文件。使用sed命令的优势是可以一次操作多个文件。

sed -i 命令的格式是: sed -i 's/old_str/new_str/g'。/g的作用是全局替换。


现在插入一个小插曲,正则表达式和通配符的区别是什么?什么是正则表达式?什么是通配符?

正则表达式和通配符的区别:

什么是正则表达式?

什么是通配符?


有了上面的基础,所以使用正则表达式来完成我们的操作。

sed -i 's/\/\*     \*\/ //g' DigestChallenge.java

上面的语句对起作用,但是如果出现这种情况,怎么办?

也就是说,两个星号*内部夹着5个字符,这些字符可能是空格" ",也可能是数字"1"。解决:可以使用正则表达式元字符"."匹配除了换行符之外的任意字符。

sed -i 's/\/\*.....\*\///g' DigestChallenge.java

完成,但是替换之后的结果会出现多个空行:

而且,有的还是没有去除(因为中间有4个空格,而不是5个)

使用下面一行的命令可以完成,.匹配任意字符,*代表重复的次数。最后面的*是一个通配符,匹配所有文件。

adog@E531:client$ sed -i 's/\/.*\*\///g' *

但是问题来了,我有很多个文件夹,每个文件夹内部可能还有很多文件夹后者文件,那么如何找出所有文件夹中的所有文件,并对这些文件进行sed -i操作进行替换呢?

这里再次引入一个小插曲,即grep命令的使用

查看grep命令的帮助文档:

-l, --files-with-matches
              Suppress normal output; instead print  the  name  of
              each  input  file  from  which output would normally
              have been printed.  The scanning will  stop  on  the
              first match.
-r, --recursive
              Read all files under  each  directory,  recursively,
              following  symbolic  links  only  if they are on the
              command line.  Note  that  if  no  file  operand  is
              given, grep searches the working directory.  This is
              equivalent to the -d recurse option.
Repetition
       A  regular  expression  may  be  followed by one of several
       repetition operators:
       ?      The preceding item is optional and matched  at  most
              once.
       *      The  preceding  item  will  be  matched zero or more
              times.
       +      The preceding item  will  be  matched  one  or  more
              times.
       {n}    The preceding item is matched exactly n times.
       {n,}   The preceding item is matched n or more times.
       {,m}   The preceding item is matched at most m times.  This
              is a GNU extension.
       {n,m}  The preceding item is matched at least n times,  but
              not more than m times.

-r参数的作用是递归进行查询,-l参数的作用是第一次匹配到之后就停止。

-l参数解释:如果文件a.txt中有多个相通的字符串abc.....abc.....abc,如果不加-l参数,则会匹配三次,每次匹配到都输出一次

如果不加-l,如下,,点"."表示当前目录

字符串public在文件DigestChallenge.java文件中出现了多次,每次匹配到都打印出来,所以,这不是我们想要的,所以需要加上-l参数。

也就是说,递归查找所有的文件。

现在文件路径和文件名都有了,接下来就是讲sed命令和grep命令结合在一起了。

直接上命令:

sed -i 's/\/.*\*\///g' `grep "*" -rl .`

其中,grep命令相关被符号``包围了。这样就能实现递归对指定的所有文件夹的所有文件进行sed替换操作了。


只剩下删除空行的操作了:

上面的命令只能删除纯正的空行,即不含有任何的空格或者Tab符号。

下面的命令能够删除所有空行,包括非纯正空行(包含空格或者Tab符)和纯正空行(不包含空格或者Tab符,即直接回车后的空行)。

综上,两条命令达到目标:

替换的话前有s,删除的话后有d

-----------完--------------

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SedGrep是在Linux和Unix系统中非常常用的命令行工具,可以用于快速替换和查找字符串。 下面是一个示例,使用sed命令批量替换文本中的字符串: 假设我们有一个名为example.txt的文本文件,其中包含以下内容: ``` The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy cat. The quick brown fox jumps over the lazy bird. ``` 现在,我们想要将所有的“fox”替换为“dog”,我们可以使用以下命令: ``` sed 's/fox/dog/g' example.txt ``` 这个命令中的s表示替换(substitute),/fox/表示要被替换的字符串,/dog/表示替换成的字符串,g表示全局匹配。 如果我们只想替换第二行中的“fox”,我们可以使用以下命令: ``` sed '2s/fox/dog/' example.txt ``` 这个命令中的2s表示只替换第二行,其他部分与上面的命令相同。 接下来是一个使用grep命令查找字符串的示例: 假设我们有一个名为example.txt的文本文件,其中包含以下内容: ``` The quick brown fox jumps over the lazy dog. The quick brown fox jumps over the lazy cat. The quick brown fox jumps over the lazy bird. ``` 现在,我们想要查找包含“cat”的所有行,我们可以使用以下命令: ``` grep 'cat' example.txt ``` 这个命令将返回包含“cat”的所有行。 如果我们想要查找不包含“cat”的所有行,我们可以使用以下命令: ``` grep -v 'cat' example.txt ``` 这个命令中的-v表示反向匹配,即匹配不包含“cat”的所有行。 总之,sedgrep是非常强大的命令行工具,可以用于快速替换和查找字符串。在日常工作中,我们可以充分利用它们来提高工作效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值