如何使用 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 中的global
s/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