使用 coreutils for windows 中的 tr

使用 coreutils for windows 中的 tr

我必须在脚本中将文件内容从 \ 转换为 Windows 上的 \\。因此我获取了 Coreutils 并尝试在 Windows CMD 上使用 tr \ \\ < file_in > file_out,但 file_out 中的 \ 仍为 \,而不是转换为 \。文件包含 LF(\n) 和 CRLF(\r\n),但它们必须保持不变。是否存在使用 tr 执行我尝试执行的更改的方法?

答案1

正如其他人所说,tr只能将一个字符转换为另一个字符。

你可以使用我的JREPL.BAT 正则表达式文本处理实用程序轻松高效地解决您的问题。它是纯脚本(混合 JScript/批处理),可在 XP 及以上版本的任何 Windows 机器上本地运行。

jrepl "\" "\\" /l /f file.txt /o -

以上将用 \r\n 终止符写入每一行。

如果必须保留原始行终止符,则可以使用/M多行选项

jrepl "\" "\\" /l /m /f file.txt /o -

上述命令使用/L文字开关。如果没有/L,该命令会将搜索词解释为正则表达式,因此您需要:

jrepl "\\" "\\" /m /f file.txt /o -

call jrepl如果在批处理脚本中使用该命令则使用。

有趣的是,JREPL 有一个/T转换选项,其功能与 unixtr命令非常相似。但它在您的情况下没有任何用处。

用于jrepl /?查看内置文档。more如果要将输出限制为一次一个屏幕,请将输出传输到。我不需要,more因为我的控制台窗口配置了一个大的输出缓冲区,这样我就可以向上滚动查看之前的输出。

答案2

Tr 仅翻译单个字符。要将其替换为多个字符,需要使用 sed。可以在 GnuWin32(适用于 Windows 的 Linux 工具的端口)中找到它。要替换,\\\应该使用 fe

  cat file | sed "s_\\_\\\\_g" 

s 代表单独模式,g 代表全局 - 默认情况下,sed 仅替换行中的第一个出现内容。\\\\而不是和\\因为反斜杠必须使用额外的反斜杠进行转义。\\\\\\\\\\\

答案3

tr处理单个字符,它实际上并不处理字符串,尽管有重叠。

您可以将单个字符的多次出现替换为一次出现(替换\\\),该选项称为“缩小”,但您可能希望采用另一种方式。理论上,可以说这同样涉及单个字符,但是,tr 无法做到这一点,它没有选项为其提供一个字符并说明它应该出现多少次。它有缩小字符选项,但没有重复字符选项。

您可以使用 sed,您可能会发现必须使用单引号而不是双引号

 $ echo '\' | sed 's_\\_\\\\_g'
\\

或者sed 's/a/b/g' filename

语法与 sed 及其 s 命令相同, 在末尾sed "s/find/replace/" 添加g修饰符可确保它不会只停留在第一个,而是替换每个出现的位置。sed 's/find/replace/g' 通常人们使用 / 您可以使用 _ 即 s_a_b_g 您不会在 g 后添加 /。

至于\r\n\n 那行 sed 不会影响它。\r\n没有与实际的反斜杠一起存储,而是与它所代表的 ascii 代码的二进制文件一起存储。13 为\r和 10 为\n 查看 ascii 表你就会明白。

相关内容