SED使用求助:删除指定模式间内容且保留第二个匹配模式
解决SED删除指定用户信息但保留下一个用户行的问题
你遇到的问题是因为SED的范围删除逻辑:/^\s*Name Rohit/,/^\s*Name/d 会把从Name Rohit行到下一个Name行的所有内容全部删除,所以连Name Ravi那行也被删掉了。结合你的场景(每个用户信息在单行),这里有两种靠谱的解决办法:
方案1:单行场景最简洁的写法
既然每个用户的信息都在单独一行,完全不需要范围匹配,直接定位到目标行删除就行:
sed '/^\s*Name Rohit/d' del.txt
这个命令的逻辑很直白:
^\s*匹配行首可能存在的空白字符Name Rohit精准匹配你要删除的用户行d执行删除操作
执行后就能得到预期输出:
Name Ravi profession = working place = chennai like = xyz
方案2:兼容多行用户信息的通用方案
如果你的实际场景里用户信息可能跨多行(比如Name Rohit单独一行,后续的profession等在其他行),可以用这个更通用的命令,它会删除从Name Rohit开始到下一个Name行之前的所有内容,同时保留下一个用户的起始行:
sed '/^\s*Name Rohit/{:a;N;/^\s*Name/!ba;s/.*\n//}' del.txt
拆解一下这个命令的逻辑:
/^\s*Name Rohit/{...}:找到目标起始行后,执行大括号内的操作:a:定义一个循环标签aN:把下一行追加到当前的模式空间(相当于把多行内容合并处理)/^\s*Name/!ba:如果当前模式空间的最后一行不是以Name开头,就跳回标签a继续循环,直到找到下一个Name行s/.*\n//:把模式空间中最后一个换行符之前的所有内容清空,只保留最后一行(也就是下一个用户的Name行)
这样不管用户信息是单行还是多行,都能精准完成需求。
内容的提问来源于stack exchange,提问作者Rohit
相关产品推荐
相关产品推荐

