如何使用 sed 全局删除除某些标点符号之外的所有标点符号?

如何使用 sed 全局删除除某些标点符号之外的所有标点符号?

如何使用 sed 从文件中删除所有标点符号(某些字符除外)?具体来说,我想保留这些字符:

@-_$%

我目前正在使用它来删除所有标点符号,但我不确定如何修改它以保留这些字符:

cat input.txt | sed -e "s/[[:punct:]]\+//g" > output.txt

或者,如何仅删除某些标点符号?喜欢:

.!?,'/\"()[]^*

答案1

sed方法:

示例文件内容:

.!?,'/\"()[]^* @-$%
.!?,'/\"()[]^* @ sdfsd %
as,,d//asd a?sd %%   --@_ _asdasdad$
sdfsdf %''%!% 2 + 2 = (?)

sed '/[[:punct:]]*/{ s/[^[:alnum:][:space:]@_$%-]//g}' file

输出:

 @-$%
 @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2  2  

答案2

仅删除字符:

.!?,'/\"()[]^*

使用像这样的字符类:

[][.!?,'/\\"()^*]

注意,]字符必须是第一的。 而且,^不能是第一个,因为那意味着完全不同的东西。并且反斜杠被转义。

现在,实际上使用这个字符类,你必须把它交给 Sed。一种方法是把

s/[][.!?,'/\\"()^*]\+//g

在一个文件中,并用sed -f scriptfile input.txt.

另一种(更棘手的)方法是使用 shell 引用:

sed -e 's/[][.!?,'\''/\\"()^*]\+//g' input.txt

对于问题的另一部分,无法匹配字符类中的所有字符除了某些列出的字符。

但是,您可以匹配所有非标点符号,如下所示:

[^[:punct:]]

答案3

您可以使用以下方法轻松做到这一点perl6

perl6 -pe 's:g/<:punct-[-@_%]>+//' file
  • <:punct-[-@_%]>将匹配任何标点字符,除了-@_%.
  • :g是开关(如perl5 或 sed 中的globals/foo/bar/ )g

为了允许答案之间的比较(也因为我很懒),我将重用 @RomanPerekhrest 的示例输入:

.!?,'/\"()[]^* @-$%
.!?,'/\"()[]^* @ sdfsd %
as,,d//asd a?sd %%   --@_ _asdasdad$
sdfsdf %''%!% 2 + 2 = (?)

所以这一行:

perl6 -pe 's:g/<:punct-[-@_%]+[^]>+//' file

给出:

^ @-$%
^ @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2 + 2 = 

请注意,它与@RomanPerekhrest 给出的答案不同。如果您认为^, =or+也应该包含在内,那么您可以使用以下行:

perl6 -pe 's:g/<:punct-[-@_%]+[^+=]>+//' file

输出将是相同的:

 @-$%
 @ sdfsd %
asdasd asd %%   --@_ _asdasdad$
sdfsdf %%% 2  2  

相关内容