【问题标题】:Reverse strings in a text file using command-line tools like AWK or SED使用 AWK 或 SED 等命令行工具反转文本文件中的字符串
【发布时间】:2015-02-06 22:20:36
【问题描述】:

我有一个包含类似行的文本文件

ABCD
1234
bear
Anders Ångström

我需要把它变成

DBCA
4321
raeb
mörtsgnÅ srednA

我需要在命令行中执行此操作,所以我认为 AWK 是完成这项工作的最佳工具,但我可能错了。也许可以用正则表达式替换来做到这一点? Notepad2 知道正则表达式替换。

稍后编辑:我需要在 Windows 中执行此操作(我正在使用 GNUWin32 工具),并且我需要它来处理 Å、ö、ë、Ş、Ĕ 等 Unicode 字符。

【问题讨论】:

  • Å 等 Unicode 字符的问题在于它不是一个字符,而是一组表示一个字符的代码。 �。这样,将其作为一个组反转是错误的。我不确定你是否找到了一个好的解决方案。为什么需要反转它?

标签: windows text command-line awk reverse


【解决方案1】:

使用rev 命令,如下所示。

$ rev < file
DCBA
4321
raeb

【讨论】:

  • 哦!..刚刚看到这个..和我的回答一样!
  • 我在 Windows 或 GNUWin32 软件包中找不到 rev 实用程序。我在哪里可以获得该实用程序的 Windows 版本?
【解决方案2】:

用 rev 命令试试这个:

rev File

示例:

AMD$ cat File
ABCD
1234
bear
AMD$ rev File
DCBA
4321
raeb


man rev : 
The rev utility copies the specified files to the standard output,
reversing the order of characters in every line.  If no files are speci-
fied, the standard input is read.

【讨论】:

    【解决方案3】:

    这是awk

    awk -vFS= '{do printf $(NF);while(--NF>0);print ""}' file
    DCBA
    4321
    raeb
    

    或者像这样:

    awk -vFS= '{for (i=NF;i>=1;i--) printf $(i);print ""}' file
    DCBA
    4321
    raeb
    

    为了最正确地使用printf,请将其从printf $(i) 更改为printf "%s",$(i)

    【讨论】:

    • 如果没有像“Ë”这样的 Unicode 字符,第二种解决方案可以正常工作。注意:在 Windows 中,我必须转义引号 (\")。第一个解决方案给了我一个错误:“gawk: (FILENAME=in.txt FNR=4) fatal: NF set to negative value - 当文件有空行时
    • @BearBear 你应该已经发布了这是在 Windows 上,并且你从一开始就有 Unicode 字符。如您所见,没有任何效果。
    【解决方案4】:

    如果您对 Sed 解决方案感兴趣,这里是:

    +$ sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//' <<EOF
    +> ABCD
    +> 1234
    +> bear
    +> EOF
    DCBA
    4321
    raeb
    

    您可以在http://sed.sourceforge.net/sed1line.txt 找到更多 Sed 中的只写程序。

    【讨论】:

    • 谢谢,它很慢,但如果输入文本文件中没有像“Ĕ”或“Ş”这样的Unicode字符,它可以正常工作。
    • @BearBear 嗯。实际上,它适用于任何字符。你最好检查一下你的区域设置。
    【解决方案5】:

    您可以使用 rev 命令。

    rev < filename > output filename
    

    输出将存储在文件中。如果您不提供,它将打印在标准输出中

    【讨论】:

      【解决方案6】:

      这个perl 可以。
      但不确定您是否有适用于 Windows 的 perl。如果没有,请将文件复制到 linux 服务器,然后进行转换。

      perl -ne 'chomp;print scalar reverse . "\n";' file
      DCBA
      4321
      raeb
      mörtsgnÅ srednA
      

      这个 bash 脚本也可以在 linux 中工作

      cat convert
      #!/bin/bash
      input="$1"
      for (( i=${#input}-1; i>=0; i-- ));do
              reverse="$reverse${input:$i:1}"
      done
      echo "$reverse"
      

      ./convert Ångström
      mörtsgnÅ
      

      【讨论】:

        猜你喜欢
        • 2017-11-09
        • 2012-07-01
        • 1970-01-01
        • 2019-11-11
        • 2015-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-10
        相关资源
        最近更新 更多