For loop 使用sed删除目录中所有文本文件中的字符

For loop 使用sed删除目录中所有文本文件中的字符,for-loop,sed,For Loop,Sed,我有很多文本文件是电子邮件模板。出于某种原因,他们中的许多人有以下几行: Best Regards,œ 最后那个奇怪的字符是我感兴趣的,我想用一个命令从所有这些文件中删除它 我试过: for f in * do sed 's/"Best Regards,œ"/"Best Regards,"/g' $f | tee $f.t && mv $f.t $f done 这贯穿了整个过程,但实际上并没有删除“œ”字符 请让我知道我做错了什么,这样我就可以使用regex[:aln

我有很多文本文件是电子邮件模板。出于某种原因,他们中的许多人有以下几行:

Best Regards,œ
最后那个奇怪的字符是我感兴趣的,我想用一个命令从所有这些文件中删除它

我试过:

for f in *
do 
  sed 's/"Best Regards,œ"/"Best Regards,"/g' $f | tee $f.t && mv $f.t $f
done 
这贯穿了整个过程,但实际上并没有删除“œ”字符

请让我知道我做错了什么,这样我就可以使用regex[:alnum:]删除这个字符,或者删除其他非字母数字字符

我通过以下方法修复了删除不需要的字符的问题:

for f in * 
do 
  sed 's/Best\ Regards\,\œ/Best\ Regards\,/g' $f | tee $f.t && mv $f.t $f   
done 
但是,这仍然不会从每个文件的每一行中删除所有非字母数字字符。我尝试过的其他方法要么不执行,要么删除整行


我感谢你的帮助

您不需要循环。您可以将glob表达式的结果直接传递给sed,并使用
-i
选项就地编辑文件:

sed -i.bak 's/Best Regards,œ/Best Regards,/' *
-i.bak
更改输入文件并创建扩展名为
.bak
的备份文件

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

使用GNU时:

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

你不需要这个循环。您可以将glob表达式的结果直接传递给sed,并使用
-i
选项就地编辑文件:

sed -i.bak 's/Best Regards,œ/Best Regards,/' *
-i.bak
更改输入文件并创建扩展名为
.bak
的备份文件

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

使用GNU时:

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

如果① 您不需要担心Unicode、UTF任何东西、LANG等等② 如果您确信以“致以最良好的祝愿”开头的台词,并且只有这些台词才是您想要影响的台词,您可以简单地执行以下操作:

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
这些解决方案不使用
tee
mv
,而是使用sed的内置“就地”选项,并因此创建一个.bak文件。有关如何使用
-i
选项的更多信息,请参阅实现
sed
的文档,它在不同的
sed
中的工作方式略有不同


这种方法无需特别搜索该角色,因此您无需担心它的表示方式。不过要小心,它还会删除同一行搜索字符串后面的任何其他文本。

① 您不需要担心Unicode、UTF任何东西、LANG等等② 如果您确信以“致以最良好的祝愿”开头的台词,并且只有这些台词才是您想要影响的台词,您可以简单地执行以下操作:

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
这些解决方案不使用
tee
mv
,而是使用sed的内置“就地”选项,并因此创建一个.bak文件。有关如何使用
-i
选项的更多信息,请参阅实现
sed
的文档,它在不同的
sed
中的工作方式略有不同


这种方法无需特别搜索该角色,因此您无需担心它的表示方式。不过要小心,它还会删除同一行上搜索字符串后面的任何其他文本。

您是如何将字符添加到命令行的?查找-键入f-名称“*.txt”可能也会这样做。您所说的
所有非字母数字字符是什么意思?假设您的文件中有一个
§
,是否也要删除该文件?或者您在每个文件中都有多个
œ
?§不是这些文件中的字符。如果有法律文件或引用法律的东西,这就提出了一个很好的观点。我指的是像“œ”这样的字符,它们不在我的美国英语键盘上。在这种情况下,我需要;,/\。[ ] { } | - = + ( ) * & ^ % $ # @ ! ~ ` ? > < “'and:.@technerdius,从技术上讲,
œ
是字母数字集合的一部分。the(及其朋友the)不是。在编写过滤器时,可能更容易“允许你想要的”,而不是“删除你不想要的”。
sed-e的/[^[:print:]//g'
可能是一个有用的实验。您是如何将字符添加到命令行的?find.-type f-name'*.txt'可能也会这样做。您所说的
所有非字母数字字符是什么意思?假设您的文件中有一个
§
,您希望删除它吗?或者您有多个de>œ
在每个文件中?§不是这些文件中的一个字符。如果有法律文件或引用法律的东西,这就提出了一个很好的观点。我指的是像“œ”这样的字符,它们不在我的美国英语键盘上。在这种情况下,我需要;,/\.[]{}-=+()*&^%$,
œ
是字母数字集合的一部分。(连同它的朋友)不是。在编写过滤器时,“允许你想要的”可能比“删除你不想要的”更容易<代码>sed-e的/[^[:pr