GNU sed

正则表达式:删除包含“帮助”等的行

ⅰ亾dé卋堺 提交于 2020-02-28 00:49:40
我有一个很长的命令文件。 使用Notepad ++或regex,我想删除所有包含“help”的行,包括keyboard_help等。 如何才能做到这一点? #1楼 在Notepad ++中执行此操作的另一种方法是在“查找/替换”对话框中使用正则表达式: 按Ctrl + h以显示查找替换对话框。 在 Find what: 文本框中包含正则表达式: .*help.*\\r?\\n (其中 \\r .*help.*\\r?\\n 是可选的,以防文件没有Windows行结尾)。 将 Replace with: 文本框保留为空。 确保选中“搜索模式”区域中的“正则表达式”单选按钮。 然后单击 Replace All 瞧! 包含搜索字词 help 所有行都已删除。 #2楼 如果您使用的是 Windows ,请尝试使用 findstr 。 不需要第三方工具: findstr /V /L "searchstring" inputfile.txt > outputfile.txt 它也支持正则表达式! 只需阅读该工具的帮助 findstr /? 。 PS如果你想处理 庞大的 文件(比如400 MB的日志文件),文本编辑器的内存效率就不高,因此,正如有人已经指出的那样,命令行工具是可行的方法。 但Windows上没有grep,所以...... 我只是在1 GB的日志文件上运行它,它花了3秒钟。 #3楼

如何将多行文件名连接到一个自定义分隔符?

戏子无情 提交于 2020-02-27 22:52:06
我想将 ls -1 的结果加入到一行中,并用我想要的任何内容划分它。 我可以使用任何标准的Linux命令来实现这一目标吗? #1楼 ls 连接到管道时产生一个列输出,因此 -1 是多余的。 这是使用内置 join 函数的另一个perl答案,它不会留下尾随分隔符: ls | perl -F'\n' -0777 -anE 'say join ",", @F' 隐藏的 -0777 使perl在运行程序之前读取所有输入。 sed替代品,不留下尾随分隔符 ls | sed '$!s/$/,/' | tr -d '\n' #2楼 我觉得这个很棒 ls -1 | awk 'ORS=","' ORS是“输出记录分隔符”,所以现在你的行将用逗号连接。 #3楼 此命令适用于PERL粉丝: ls -1 | perl -l40pe0 这里40是空间的八进制ascii代码。 -p将逐行处理并打印 -l将负责用我们提供的ascii字符替换尾部\\ n。 -e是告知PERL我们正在执行命令行。 0表示实际上没有执行命令。 perl -e0与perl -e'相同 #4楼 不要重新发明轮子。 ls -m 它正是如此。 #5楼 ls 有选项 -m 用 ", " 逗号和空格分隔输出。 ls -m | tr -d ' ' | tr ',' ';' 将此结果传递给 tr 以删除空格或逗号将允许您再次将结果传递给 tr

linux基础第五周

断了今生、忘了曾经 提交于 2020-02-27 21:15:06
1、查找/etc目录下大于1M且类型为普通文件的所有文件 find /etc -size +1M -type f 2、打包/etc目录下所有conf结尾的文件,压缩包名称为当天时间,并拷贝到/usr/local/src目录备份 tar Jcvf /usr/local/src/`date +%F`.tar.xz /etc/*conf 3、利用sed取出ifconfig命令中本机的IPv4地址 ifconfig ens33 |grep netmask |sed -nr 's/.*inet[[:space:]](.*)[[:space:]]netmask.*/\1/p' 4、删除/etc/fstab文件中所有以#开头偶棉至少跟一个空白字符的行的行首的#和空白字符 sed -ri 's/^\# +//' /etc/fstab 5、处理/etc/fstab路径使用sed命令取出其目录名和基名 echo /etc/fstab |sed -nr 's@(\/.*)\/(.*)@\1@p' 取/etc/fstab的目录名 echo /etc/fstab |sed -nr 's@(\/.*)\/(.*)@\2@p' 取/etc/fstab的基名 来源: oschina 链接: https://my.oschina.net/u/4147271/blog/3167563

shell脚本:遍历删除文本内路径上文件

筅森魡賤 提交于 2020-02-27 15:51:56
windows上测试可以安装Git linux中,准备删除文件的脚本deleteFile.sh,picture.txt保存待删除文件的文件路径,picture文件夹下面有三张待删除图片a/b/c.jpg deleteFile.sh脚本如下: #!/bin/bash #shell脚本 保存路径的文本 #./deleteFile.sh ./picture.txt #判断位置参数是否为1 if [ $# -ne 1 ];then echo "Usage $0 filename" exit fi #判断位置参数是否为文件 if [ ! -f $1 ];then echo "the $1 is not a file" exit fi #待删除文件路径的文本 filename=$1 echo "filename: $filename" >> info.txt #计算待删除的文件数量(总行数) NUM= sed -n '$=' $filename echo "picture delete num: $NUM" #逐行读取文件内容并删除对应路径的文件 success=0 for i in cat $filename do #成功信息重定向输出到info.txt echo "delete success: $i" >> info.txt rm -rf $i success= expr

我该如何使我的比赛在vim中变得不贪心?

风格不统一 提交于 2020-02-27 10:14:01
我有一个很大的HTML文件,其中包含很多如下所示的标记: <p class="MsoNormal" style="margin: 0in 0in 0pt;"> <span style="font-size: small; font-family: Times New Roman;">stuff here</span> </p> 我试图做一个Vim搜索和替换来摆脱所有的 class="" 和 style="" 但是我很难使比赛变得不愉快。 我的第一次尝试是 %s/style=".*?"//g 但是Vim似乎不喜欢 ? 。 不幸地删除 ? 使比赛过于贪婪。 如何使我的比赛不愉快? #1楼 怎么了 %s/style="[^"]*"//g #2楼 我发现,针对此类问题的一个好的解决方案是: :%!sed ... (如果愿意,也可以使用perl)。 IOW而不是学习vim的正则表达式特性,而是使用您已经知道的工具。 使用perl会使? 修改器工作以使匹配不满意。 #3楼 G'day, Vim的正则表达式处理不太出色。 我发现sed的regexp语法与vim功能的正确匹配有关。 我通常将搜索突出显示设置为(:set hlsearch),然后在输入斜线后进入搜索模式,然后使用正则表达式。 编辑: 马克,Dale Dougherty的出色著作“ Sed&Awk”(经过 消毒的Amazon链接

如何使用Windows命令行环境查找和替换文件中的文本?

北慕城南 提交于 2020-02-27 05:52:55
我正在使用Windows命令行环境编写批处理文件脚本,并希望用另一个文件(例如“ BAR”)更改文件中每个文本(例如“ FOO”)的每次出现。 最简单的方法是什么? 有内置功能吗? #1楼 我在这里尝试了一些现有的答案,并且更喜欢改进的解决方案... type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" 或者如果您要将输出再次保存到文件中... type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt 这样做的好处是您可以通过管道传递任何程序的输出。 也会考虑与此一起使用正则表达式。 虽然无法解决如何将其制作成BAT文件以便于使用的问题... :-( #2楼 使用FNR 使用 fnr 实用程序。 与 fart 相比,它有一些优点: 常用表达 可选的GUI。 具有“生成命令行按钮”以创建命令行文本以放入批处理文件中。 多行模式:GUI使您可以轻松使用多行模式。 在FART中,您必须手动转义换行符。 允许您选择文本文件编码。 还具有自动检测选项。 在此处下载FNR: http : /

关于Linux,你应该了解哪些

旧时模样 提交于 2020-02-27 04:53:15
最有用系列: 《 Linux上,最常用的一批命令解析(10年精选)》 《Linux生产环境上,最常用的一套“vim“技巧》 《Linux生产环境上,最常用的一套“Sed“技巧》 《Linux生产环境上,最常用的一套“AWK“技巧》 《"Sed" 高级功能:我这小脑瓜都快绕晕了》 Linux 命令好像还真不少,根本原因就是软件多,也有像 ag 这样的命令想替代 grep ,但大多数命令古老而坚挺。不是因为这些软件设计的有多好,原因是一些软件最开始入驻了系统,时间久了,就变成了一种约定,这种习惯改变代价太大,就像把所有键盘的 L 和 F 换一下一样。 这片文章假定你已经了解大多数Linux命令,并了解操作系统的基本元素。如果你现在了解的命令还不足10个,下面的内容就不用看了。除了最基本的东西,本文列出一些对你的面试最常见的最能加分的地方,有些组合可能是你没见过的技巧。但本文仅仅是给出一个大致的轮廓和印象,为以后的专题性考察点作一个序。 本文中出现的所有命令,应该熟记并熟练使用。 几种比较典型的Linux系统 首先对目前的Linux版本有个大体的印象,大体分Desktop版和Server版,已经是百花齐放。 Ubuntu 最常见的Linux个人发行版,一位有情怀的南非富豪,有了钱你也可以这么做 CentOS 最常用Linux服务器发新版,RHEL的开放版本,因版权而生的轮子 Arch

通过Bash命令在文本文件中查找和替换

与世无争的帅哥 提交于 2020-02-27 02:57:34
查找和替换给定输入字符串(例如 abc )并替换为另一个字符串(例如文件 /tmp/file.txt XYZ 的最简单方法是什么? 我正在编写一个应用程序,并使用IronPython通过SSH执行命令-但我不太了解Unix,也不知道要寻找什么。 我听说Bash除了是命令行界面之外,还可以是一种非常强大的脚本语言。 因此,如果这是真的,我假设您可以执行类似的操作。 我可以用bash做到吗,实现我的目标最简单的脚本(一行)是什么? #1楼 找到了这个线程,我同意它包含最完整的答案,所以我也添加了我的: 1)sed和ed非常有用...用手! 从@Johnny看下面的代码: sed -i -e 's/abc/XYZ/g' /tmp/file.txt 2)当我的限制是要通过shell脚本使用它时,不能在内部使用任何变量代替abc或XYZ! 这 似乎至少符合我的理解。 因此,我不能使用: x='abc' y='XYZ' sed -i -e 's/$x/$y/g' /tmp/file.txt #or, sed -i -e "s/$x/$y/g" /tmp/file.txt 但是,我们该怎么办? 因为,@ Johnny说使用“读的时候...”,但是不幸的是,这还不是故事的结局。 以下内容对我来说效果很好: #edit user's virtual domain result= #if

SNAT,DNAT,REDIRECT 练习题

倖福魔咒の 提交于 2020-02-26 21:44:08
SNAT,DNAT,REDIRECT 练习题 firewall> echo 1 > /proc/sys/net/ipv4/ip_forward iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 192.168.209.19 iptables -t nat -R POSTROUTING 1 -s 192.168.1.0/24 -j MASQUERADE 实现了内网的主机通过SNAT技术上网了 A> yum install httpd -y sed -ri 's@^#(ServerName)@\1@' /etc/httpd/conf/httpd.conf service httpd start echo LAN > /var/www/html/index.html firewall> iptables -t nat -A PREROUTING -d 192.168.209.19 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.9:80 iptables -t nat -A PREROUTING -d 192.168.209.19 -p tcp --dport 3306 -j DNAT --to-destination 192.168.1.49

Bash工具从文件获取第n行

|▌冷眼眸甩不掉的悲伤 提交于 2020-02-26 19:03:20
有没有一种“规范”的方式来做到这一点? 我一直在使用 head -n | tail -1 head -n | tail -1 可以达到目的,但是我一直在想是否有一个Bash工具专门从文件中提取一行(或一系列行)。 “规范”是指一个程序,其主要功能就是这样做。 #1楼 # print line number 52 sed '52!d' file sed有用的单行脚本 #2楼 使用 awk 可以非常快: awk 'NR == num_line' file 如果为true,则执行 awk 的默认行为: {print $0} 。 替代版本 如果您的文件碰巧很大,则最好在读取所需行后 exit 。 这样可以节省CPU时间。 awk 'NR == num_line {print; exit}' file 如果要从bash变量中提供行号,可以使用: awk 'NR == n' n=$num file awk -v n=$num 'NR == n' file # equivalent #3楼 这个问题被标记为Bash,这是Bash(≥4)的处理方式:使用带有 -s (跳过)和 -n (计数)选项的 mapfile 。 如果您需要获取文件 file 的第42行: mapfile -s 41 -n 1 ary < file 此时,您将拥有一个数组 ary ,该数组的字段包含 file 行