如何在[split]模式之后修改文件或stdin但是下一个[split]模式没有分隔或排除假设[split]模式可以无限制地发生?
简单地说,第一个[split]模式是如何分隔的,接下来不是?
主要使用sed,如果不能,请使用其他工具,如awk和其他工具。
INPUT:
WATER[split]FIRE[split]AIR[split]
我试过了:
~$ echo WATER[split]FIRE[split]AIR | sed s/.*\\[split]//
我的结果是:
AIR
我想要的OUTPUT是这样的:
FIRE[split]AIR
请问这怎么办?
答案 0 :(得分:0)
Bash和parameter substitution:
$ foo=WATER[split]FIRE[split]AIR[split]
$ bar=${foo#*\[split\]} # head off
$ echo ${bar%\[split\]*} # tail off
FIRE[split]AIR
${var%Pattern}
从$var
移除$Pattern
与后端匹配的$var
最短部分}}
${var#Pattern}
从$var
移除$Pattern
与前端匹配的$var
最短部分}}
答案 1 :(得分:0)
echo WATER[split]FIRE[split]AIR | sed 's/\[split]/[SPLIT2]/; s/.*\[SPLIT2]//'
答案 2 :(得分:0)
假设您没有在多行缓冲区上创建和操作:
$ echo 'WATER[split]FIRE[split]AIR' | sed 's/\[split]/\n/; s/.*\n//'
FIRE[split]AIR
如果您正在使用多行缓冲区,那么您不能指望输入中不存在换行符或任何其他字符,因此您必须创建一个(#
以下),以便执行此操作将是:
$ echo 'WATER[split]FIRE[split]AIR' |
sed 's/@/@A/g; s/#/@B/g; s/\[split]/#/; s/.*#//; s/@B/#/g; s/@A/@/g'
FIRE[split]AIR
第一个脚本仅适用于接受\n
作为换行符的seds,其他seds使用反斜杠后跟文字换行符:
$ echo 'WATER[split]FIRE[split]AIR' | sed 's/\[split]/\
/; s/.*\
//'
FIRE[split]AIR