2015-11-23 35 views
0

我有很多的是电子邮件模板的文本文件。他们中许多人,出于某种原因,有以下行:中的所有文本文件的目录使用删除字符SED

Best Regards,œ 

这在年底奇怪的字符是什么,我希望从所有这些文件中移除通过一个命令。

我想:

for f in * 
do 
    sed 's/"Best Regards,œ"/"Best Regards,"/g' $f | tee $f.t && mv $f.t $f 
done 

这跑了整个过程,但实际上并没有删除“O E”字符。

请让我知道我在做什么错误,所以我可以使用正则表达式删除此字符,也许其他非字母数字字符[:alnum:],也许。

我固定的问题与删除不需要的字符:

for f in * 
do 
    sed 's/Best\ Regards\,\œ/Best\ Regards\,/g' $f | tee $f.t && mv $f.t $f 
done 

然而,这仍然无法从每个文件的每一行中删除所有非字母数字字符。我试过的其他事情要么不执行或删除整个行。

我感谢您的帮助。

+1

你是如何将字符添加到命令行的? – choroba

+0

找。 -type f -name'* .txt'可能会做同样的事情。 – technerdius

+2

“所有非字母数字字符”是什么意思?假设你的文件中有一个'§',你是否也想删除它?或者你在每个文件中都有多个“ - ”? – sjsam

回答

2

如果你①不想担心的Unicode,UTF-什么,郎等,并②你有信心,是的话就行“最好的问候,”只有那些行是要影响的,你可以简单地这样做:

sed -i .bak '/^Best Regards,.*/s//Best Regards,/' * 

注意,这个处理在当前目录的所有文件。如果你想在子目录中做到这一点,你可以使用find,尽其所能。例如:

find /path/to/start/ -exec \ 
    sed -i .bak '/^Best Regards,.*/s//Best Regards,/' {} \; 

,或者如果你的shell是bash,你可以使用globstar:

shopt -s globstar 
for f in **/*; do 
    sed -i .bak '/^Best Regards,.*/s//Best Regards,/' "$f" 
done 

而不是使用teemv,这些解决方案采用 “就地” sed中的内置选项,并作为结果创建一个.bak文件。请参阅您的sed的实施文档以了解有关如何使用-i选项的更多信息 - 它与不同的sed s稍有不同。

这种方法消除了特别搜索该字符的需要,因此您不必担心它如何表示。但要小心,它也会消除在同一行中搜索字符串后面的任何其他文本。

+1

为什么在glob上循环?我们可以简单地将glob的结果传给sed显示.. – hek2mgl

+0

你说得对。 'sed -i .bak'/ ^最好的问候,。*/s //最好的问候,/'*'更容易。我想我认为如果没有循环出于某种原因,它将无法正常工作。 – technerdius

+2

@ hek2mgl - 优点,澄清。在我代谢第一天的第一杯咖啡之前,我应该真的停止堆叠。 :-P – ghoti

2

你不需要循环。您可以直接通过全局正则表达式的结果SED和地方使用-i选项编辑文件:

sed -i.bak 's/Best Regards,œ/Best Regards,/' * 

-i.bak改变输入文件到位和创建一个备份文件扩展名为.bak

sed的一些实现中,例如GNU sed甚至支持-i没有其他参数允许空字符串作为参数用于-i。在这种情况下,sed不会保留任何备份文件,只需更改原始文件。

随着GNU sed的:

sed -i 's/Best Regards,œ/Best Regards,/' * 
# OR (BSD, MacOS) 
sed -i '' 's/Best Regards,œ/Best Regards,/' * 
+2

FYI,而GNU sed允许'-i'在没有optarg的情况下指定,BSD sed允许你指定一个空的optarg(即带有一对单引号),这与没有备份的效果相同。 – ghoti

+1

@ghoti哦,好的!从来不知道。 – hek2mgl

+0

Mine is GNU,但这是很好的了解。谢谢@ ghoti – technerdius

相关问题