使用sed删除匹配模式

使用sed删除匹配模式,sed,Sed,我需要清理一个.txt文件,既有一组具有一致模式的字符串,也有一组匹配的字符串。我的意思是: 我想删除括号内的所有内容,后面跟一个冒号,例如[示例]: 然后我还要删除这个词的所有实例,例如 为了完成第一部分,我使用以下方法: sed -i new 's/\[.*]://g' rp.txt 我需要添加什么来实现第二部分,也就是删除任何匹配*的字符串 输入示例: [John]: Hello Mary. [Mary]: Hello John. 期望输出: Hello . Hello . 在Mac

我需要清理一个.txt文件,既有一组具有一致模式的字符串,也有一组匹配的字符串。我的意思是:

我想删除括号内的所有内容,后面跟一个冒号,例如[示例]:

然后我还要删除这个词的所有实例,例如

为了完成第一部分,我使用以下方法:

sed -i new 's/\[.*]://g' rp.txt
我需要添加什么来实现第二部分,也就是删除任何匹配*的字符串

输入示例:

[John]: Hello Mary.
[Mary]: Hello John.
期望输出:

Hello .
Hello .
在Mac中使用终端。

对修改后的问题的回答 如评论中所述,修改后的场景需要对数据进行两次传递。第一步确定需要编辑的内容。第二步应用编辑。解决方案包括
sort-u
,以消除方括号中给定单词的重复条目,因此“第一次”传递实际上涉及两个
sed
脚本

剧本 请注意,这是使用GNU
sed
,它支持
\b..\b
\
来包围单词(至少使用
-r
\
表示法不使用
-r
选项)。Mac OS X(BSD)
sed
也不支持,即使在
-E
选项下也是如此

样本数据 样本输出 添加代码以删除前导空格和尾随空格,并用单空格替换多个空格将很容易。稍微复杂一点的操作可以删除标点符号前的空格,如逗号或句号

原始答案 我想删除括号内的所有内容,后面跟一个冒号,例如
[示例]:

然后我还要删除这个单词的所有实例,
example

删除包含在方括号内并后跟冒号的内容很棘手,因为打开的方括号是元字符。输出是否应包括空的
[]:
?如果逐字阅读,这就是问题的要求,但你可能不想要它。因此,您需要一个:

-e 's/\[[^]]*]://g'        # Remove the square brackets and colon too
-e 's/\[[^]]*]:/[]:/g'     # Retain the square brackets and colon
诀窍在于,在字符类
[…]
中,
]
必须是字符类开头的
[
[^
之后的第一个字符。在正则表达式中,
]
本身不是元字符;它只有在
[
之后才成为元字符

请注意,这两个选项仅与第一个
]
匹配。如果您使用
*
代替
[^]]*
,则会在以下方面消除太多内容:

a line [like]: this [one]: or [something]: similar.
然后,另一个操作很简单,除非您想保持
示例
未示例
不变:

-e 's/example//g'      # Remove the string example when it appears

如果要处理单词边界,需要阅读机器的
sed
手册。sed的不同变体在标记单词边界时有不同的选项;有些人没有任何选择。当他们支持它时,
\
是一种符号
\beexample\b
是另一个例子。

对于每个人来说,有一个示例输入和所需的输出是非常有帮助的。这样,获得正确答案的迭代可能只有一次。否则,我们将试图准确地猜测您的意思,我们可能会失败;这让事情变得难以置信的困难。代码如何知道第一行上的Mary需要删除?这是否意味着我们需要两次遍历数据,一次从
[Name]:
符号生成候选名称列表,然后生成脚本来编辑文件?这将是一种方法。一行应该怎么办?
[John]:你好,玛丽。彼得·约翰逊怎么了?
Johnson
中的
John
是否遭到攻击?我希望我能再次否决投票:我反复要求获得一些示例输入和所需输出。既然Jonathan Leffler提供了一个很好的方法,那么您就需要满足这些要求,并使答案无效。明白为什么要阅读了吗?我注意到Mac OS X上的标准问题BSD
sed
不支持
-r
选项。您可能正在使用GNU
sed
(它确实支持
-r
),因为您是通过一个软件包管理器安装的,但是如果您已经这样做了,您应该这样说。这两个版本之间存在重大差异,
-r
选项是一个示例(
-i
选项的行为是另一个示例)。另外,
[Name]:
标记是否仅出现在行首?是否也要删除冒号后的空格?你想删除被删除单词周围的空格吗?请准确点!sed-r的//[.*]://g'完成了第一部分,删除了我想要的所有内容。但是我也要删除所有的例子,原因是,我试图从文本中删除所有发言者的名字,以及文本中对他们名字的引用。我不想一个接一个地删除名称,而是将它们与括号中包含的字符串相匹配。文本中没有任何名称在某些时候不显示在括号中。您需要在注释中的命令符号周围使用反引号。您需要显示一些示例输入(两行或三行)和相应的必需输出。没有这些,没有人能帮你更多。注意我对
一行[like]的观察:这个[one]:
。您可能会错误地认为在一行中永远不会出现两次
[…]:
,但您也应该在问题中这样说。另外,如果您使用的是
-r
,那么您可能正在使用GNU
sed
,可能是在Linux上。BSD
sed
没有该选项(它使用
-E
)。确定平台以获得更好的答案。
 Hello .
 Hello .
 Frank Johnson has a  that is familiar.
 A line  this  or  similar should
be munged too.
 A longer conversation with  that extends over several
lines which means that not all lines start with  but it
may actually be that when it occurs,  only actually
appears at the start of a line.
 But it doesn't matter; we don't  this , but
 similar should be OK, and should likely pacify the
Nameless ones, or someone acting all lonely on their behalf.
-e 's/\[[^]]*]://g'        # Remove the square brackets and colon too
-e 's/\[[^]]*]:/[]:/g'     # Retain the square brackets and colon
a line [like]: this [one]: or [something]: similar.
-e 's/example//g'      # Remove the string example when it appears