AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 742727
Accepted
knot22
knot22
Asked: 2023-04-13 04:13:46 +0800 CST2023-04-13 04:13:46 +0800 CST 2023-04-13 04:13:46 +0800 CST

在每个 LF 之前添加一个 CR

  • 772

我有一个正在 Windows 机器上处理的文本文件。bcp在使用实用程序将数据从文件加载到数据库表之前,需要删除尾随的制表符。

以下命令在 Bash 脚本中删除了尾随的制表符:

sed 's/[\t]*$//' < ./input/raw.txt >> ./input/data.txt

CR但它将-转换LF为LF导致bcp命令失败的原因。

为了保持CR-LF我试过这个:

sed 's/[\t]*$/$CR/' < ./input/raw.txt >> ./input/data.txt

但这导致:

在此处输入图像描述

期望的结果是:

在此处输入图像描述

如何修改命令以获得所需的输出?

bash
  • 3 3 个回答
  • 1720 Views

3 个回答

  • Voted
  1. Jim L.
    2023-04-13T04:22:40+08:002023-04-13T04:22:40+08:00

    您需要安装该unix2dos软件包。它有两个实用程序:

    unix2dos    Convert UNIX newlines to CR-LF
    dos2unix    Convert DOS CR-LF to UNIX newlines
    

    让我们创建一个包含五行的测试文件,并进行十六进制转储来检查行尾:

    $ jot -w 'line %d' 5 > foo
    $ hexdump -C foo
    00000000  6c 69 6e 65 20 31 0a 6c  69 6e 65 20 32 0a 6c 69  |line 1.line 2.li|
    00000010  6e 65 20 33 0a 6c 69 6e  65 20 34 0a 6c 69 6e 65  |ne 3.line 4.line|
    00000020  20 35 0a                                          | 5.|
    00000023
    

    我们看到每一行都以换行符结尾,十六进制 0a。

    现在我们将这些换行符转换为 DOS CR-LF 行尾,并再次检查:

    $ unix2dos foo
    $ hexdump -C foo
    00000000  6c 69 6e 65 20 31 0d 0a  6c 69 6e 65 20 32 0d 0a  |line 1..line 2..|
    00000010  6c 69 6e 65 20 33 0d 0a  6c 69 6e 65 20 34 0d 0a  |line 3..line 4..|
    00000020  6c 69 6e 65 20 35 0d 0a                           |line 5..|
    00000028
    

    现在每一行都以 CR-LF,十六进制 0d 0a 结尾。

    最后,我们可以将文件转换回原始的 UNIX 换行符:

    $ dos2unix foo
    $ hexdump -C foo
    00000000  6c 69 6e 65 20 31 0a 6c  69 6e 65 20 32 0a 6c 69  |line 1.line 2.li|
    00000010  6e 65 20 33 0a 6c 69 6e  65 20 34 0a 6c 69 6e 65  |ne 3.line 4.line|
    00000020  20 35 0a                                          | 5.|
    00000023
    
    • 23
  2. Best Answer
    Stéphane Chazelas
    2023-04-13T04:22:16+08:002023-04-13T04:22:16+08:00

    请注意,在标准中sed,从行尾sed 's/[\t]*$//'删除所有反斜杠和字符。t的 GNU 实现sed仅在其环境中存在POSIXLY_CORRECT变量时才执行此操作。

    sed 's/\t*$//'未指定,但至少在 GNU 中,无论是否在环境中,sed它都会删除尾随的 TAB 。POSIXLY_CORRECT

    在这里你可以这样做:

    sed $'s/\t*$/\r/'
    

    使用 ksh93 样式$'...'的引号形式,其中类似\t或的内容\r分别扩展为 TAB 和 CR。现在许多其他 shell 都支持它,并将出现在sh.

    如果你在 shell 变量中有 TAB 和 CR 字符,你可以不用它们,$'...'例如:

    eval "$(printf 'TAB="\t" CR="\r"')"
    

    你可以这样做:

    sed "s/$TAB*\$/$CR/"
    

    但这必须在双引号内。在单引号内,不执行扩展。

    现在,万一输入不以 LF 字符结尾(这会使它在 Unix 中成为无效文本),那些(至少在 GNU 中)会生成一个以 CR 字符结尾的文件,使其sed在DOS 也一样。

    要将文本文件从 Unix 转换为 DOS,您可以使用unix2dos不会有问题的实用程序:

    sed $'s/\t*$//' | unix2dos
    

    或者使用perl的sed模式:

    perl -pe 's/\t*$//; s/\n/\r\n/'
    

    perl -p工作方式类似于sed它为每一行输入运行代码,除了在perl模式空间($_那里)中有完整的行,包括行定界符。它还支持那些\t, \n,\r转义符(而标准sed仅支持\n且仅在正则表达式中),并且可以处理非文本文件。

    • 15
  3. jubilatious1
    2023-04-17T19:13:53+08:002023-04-17T19:13:53+08:00

    使用Raku(以前称为 Perl_6)

    ~$ cat unix2dos.raku
    my $fh1 = open $*IN, :r;
    #below :x opens write-only :exclusive (i.e. 'no-clobber')
    my $fh2 = open $*OUT, :x, nl-out => "\r\n";
    
    for $fh1.lines() { $fh2.put($_) };
    
    $fh1.close;
    $fh2.close;
    

    Raku(又名 Perl6)是 Perl 家族中的一种编程语言。Perl6 项目试图做的一件事是抽象出特定于操作系统的问题以使代码更具可移植性,而这些问题之一就是换行处理。Rakunl-in为文件句柄输入提供了一个参数(默认为["\x0A", "\r\n"]),默认自动切换行,\n在内部使用 -terminated 换行符,并nl-out为文件句柄输出提供了一个参数(默认为"\n")。

    OP的关键声明如下:

    ...但它转换CR-LF为LFwhich 导致 bcp 命令失败。

    因此,对于上面的 Raku 脚本(在您正在使用的任何平台上),您可以打开一个文件进行写入并设置nl-out => \r\n,即换行符输出到 CRLF。Rakulines懒惰地阅读,所以这个脚本应该是内存高效的。即使不使上述脚本可执行,您也可以在命令行中调用它,如下所示:

    ~$ raku unix2dos.raku < ends_with_LF.txt > ends_with_CRLF.txt
    

    上面的脚本默认采用$*INstdin,因此是“一次性的”,但 Raku 也提供读取$*ARGFILES和dir目录功能。最后,在下面的第一个链接中有关于 Raku 中换行处理的精彩总结:

    https://docs.raku.org/language/newline.html
    https://raku.org

    • 0

相关问题

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve