sed之:a;N;$!ba预读入全部内容至pattern space

123
232
313
321
[要求]

截取第一个2和最后一个2之间的内容:
3
232
313
3

即截取两个关键字之间的部分

sed ':a;N;$!ba;s/[^2]*2\(.*\)2.*/\1/' file
:a;N;$!ba; 到了最后一行不执行跳转,即把所有的行全读入pattern space中
pattern space:123\n232\n313\n321$
然后进行替换

awk '{x=x==""?$1:x RS $1}END{print gensub(/[^2]*2(.*)2.*/,"\\1","g",x)}' file
在理解了这个替换原理后我们同样可以使用awk来完成它,把所有内容赋值给一个变量,然后利用gensub函数对它进行正则替换.

awk -vRS=2 'NR>2{printf NR==3?s:"2"s}{s=$0}END{printf "\n"}' file
这样的语法结构可以打印除第一行和最后一行以外的内容,就是斩头去尾,用三目运算来控制好输出格式就行了。

awk -vRS='^[^2]*2|2[^2]*$' NF file
把开头到2的和末尾到2的设置为RS,直接NF重组输出




























  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`':a;N;$!ba;s/\n/ /g'` 是一个 sed 脚本,用于将文件中的所有换行符替换为空格,从而将所有行合并为一行。下面解释一下这个 sed 脚本的命令含义: - `:a`:定义一个标签 `a`,用于跳转; - `N`:读取下一行文本,并将其追加到当前行的末尾; - `$!ba`:如果不是最后一行,则跳转到标签 `a`; - `s/\n/ /g`:用空格替换所有的换行符。 这个 sed 脚本的具体执行过程如下: 1. 读取第一行文本,将其存储到模式空间中; 2. 执行 `N` 命令,读取第二行文本,并将其追加到模式空间的末尾; 3. 判断是否为最后一行,如果不是,则跳转到标签 `a`; 4. 执行 `s/\n/ /g` 命令,将模式空间中的所有换行符替换为空格; 5. 输出替换后的结果; 6. 重复上述步骤,直到读取完所有的行。 在执行完整个 sed 脚本后,所有行都被合并为一行,并用空格分隔每个单词。 你可以将这个 sed 脚本保存到一个文件中,例如 `myscript.sed`,然后使用以下命令来对文件进行处理: ``` sed -f myscript.sed input.txt ``` 其中,`-f myscript.sed` 表示从文件中读取 sed 脚本,`input.txt` 是需要处理的文件名。执行完上述命令后,sed 将会把 input.txt 中的所有行合并为一行,并输出到屏幕上。如果你想要将输出结果重定向到一个新的文件中,可以使用 `>` 操作符,例如: ``` sed -f myscript.sed input.txt > output.txt ``` 这将会把 sed 处理后的结果保存到一个名为 `output.txt` 的文件中。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值