[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 踏沙行 于 2018-9-4 16:17 编辑

回复 7# ai20110304
谢谢,谢谢@batcher

七楼第一条命令,能讲讲是什么意思吗?
另外,这种使用方法有一个坑,比如改成
set -n "/is/,/at/p;/at/q" 1.txt
输入结果为空,原因是“at”和“is”都在第一行,结果/at/q即直接关闭输出,把匹配第一条pattern的行输出也关闭了。

那么,能不能在第1个分号后,跳转到下一行开始执行呢?sed中有个n指令,是跳到下一行执行。但是不知道在这个语句中,怎么写才能实现该效果
  1. sed "/abc/{n;d}" 1.txt:将1.txt中包含"abc"的下一行删除
  2. sed "/abc/{n;s/ef/fe/g}" 1.txt:将1.txt中包含”abc”的下一行中的"ef"全部替换为"fe"
复制代码
请问上一句set -n "/is/,/at/p;/at/q" 1.txt,怎么改可以实现如上效果?

TOP

回复 4# Batcher


    第一个开启多条命令执行:
  1. sed -n "/at/,/is/p; /is/q" 1.txt
复制代码
第二个是或的关系,支持扩展正则表达式 | 符号,需用-r 选项:
  1. sed -n -r "/(at|is)/p" 1.txt
复制代码
我就是我,不一样的烟火!

TOP

回复 5# 踏沙行


第二种场景比较简单,以下两种写法都行:
  1. sed -n "/at\|is/p" 1.txt
复制代码
  1. sed -n -r "/(at|is)/p" 1.txt
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 2# ai20110304
谢谢楼上两位大神指导。
那么,当我想匹配以下目标时,用sed怎么实现呢?
1、从包含str1的行开始,到包含str2的行结束
2、匹配包含str1或str2的行

TOP

回复 2# ai20110304


    第四行后面还有满足的
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

参考:
http://bbs.chinaunix.net/thread-1689518-8-1.html#pid12064955

Row Number/at//is/Range Operator备注
1TRUE TRUEOnce the left operand is true,  the range operator stays true
2 FALSETRUE 
3 TRUETRUEuntil the right operand is true,  after which the range operator becomes false again
4FALSE FALSE 
5TRUE TRUEOnce the left operand is true,  the range operator stays true
6 TRUETRUEuntil the  right operand is true, after which the range operator becomes false again
7TRUE TRUEOnce the left operand is true,  the range operator stays true
8 FALSETRUE只要无法匹配到/is/,不管后面有多少行都会输出
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 1# 踏沙行


    sed 默认的命令执行范围是全局编辑的,如果不明确指定行的话,命令会在所有输入行上执行,如果想仅对其中部分行执行命令,可以使用地址限制。如果给了 2 个地址,即地址对(地址范围),则命令匹配的这个地址范围内执行,但是需要注意的是:对于像 "addr1,addr2" 这种形式的地址匹配,如果addr1 匹配,则匹配成功,"开关"打开,在该行上执行命令,此时不管 addr2 是否匹配,即使 addr2 在 addr1 这一行之前;接下来读入下一行,如果addr2 匹配,则执行命令,同样开关"关闭";如果 addr2 在 addr1 之后,则一直处理到匹配为止,换句话说,如果 addr2 一直不匹配,则开关一直不关闭,因此会持续执行命令到最后一行。

第四行过后,进行第二次匹配,以第一个地址匹配开始,不满足第二个条件,继续执行到文件结束。
我就是我,不一样的烟火!

TOP

返回列表