【问题标题】:remove DOS end of file character from many files in Linux从 Linux 中的许多文件中删除 DOS 文件结尾字符
【发布时间】:2017-04-06 11:18:04
【问题描述】:

我将数百万生成的​​ SVG 文件从 DOS 传输到 Linux 机器,然后才意识到每个文件的最后一个字符(DOS 文件结尾字符)都有一个 ^@,当我尝试显示时会出错浏览器中的 SVG 文件。

在这个问题中: How can I remove the last character of the last line of a file?

Maroun 给出的解决方案如下:

sed '$ s/.$//' your_file

但是当我修改它看起来像这样:

sed '$ s/.$//' *.SVG

find . -print | grep .SVG | sed '$ s/.$//'

它不起作用。

我还希望能够指定它应该只删除最后一个字符,如果它是 ^@。

谁能告诉我我做错了什么或如何让它工作。 SVG 文件位于数千个子目录中,因此我需要能够从树结构的顶部到底部进行更改。

【问题讨论】:

标签: linux svg sed grep find


【解决方案1】:

我猜您的第一个示例不起作用,因为它只使用了由 *.SVG 扩展的最后一个文件。第二个示例(带有 find 命令的示例)失败,因为您将 find 的输出传递给 sed 而不是文件内容。

另外,如果您想使用sed 更改文件的内容,您需要使用-i,以便“就地”执行更改。

你可以试试这个:

for file in *.SVG
do
    sed -i '$ s/.$//' $file
done

或者:

find . -name "*.SVG" -exec sed -i '$ s/.$//' {} \;

【讨论】:

  • Alvaro 我如何让你的命令只有在最后一个字符是 ^@ 时才起作用?
  • 键入第二个 $ 之前的句点,在句点之后键入 ctrl-v ctrl-m(中间没有空格)然后继续键入 $... 这应该与 dos 行尾匹配作为行的最后一个字符
  • 所以它会是: find 。 -name "*.SVG" -exec sed -i '$ s/.^v^m$//' {} \;我在 bash 中尝试了这个,它只是在现场放了一个 ^M (.^M$)。但是文件字符的 DOS 结尾是 ^@。我如何获得 ^@?我试过^v^@,但什么也没发生。
猜你喜欢
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 1970-01-01
  • 2012-03-28
  • 1970-01-01
相关资源
最近更新 更多