【问题标题】:Print the last n characters of each line using bash使用 bash 打印每行的最后 n 个字符
【发布时间】:2020-09-16 03:05:03
【问题描述】:

我有一个文件列表,每个文件都包含在自己的行中。每个文件名都有可变长度n,但每个文件的最后 7 个字符是特定标识符。我想弄清楚如何删除每行最后 7 个字符之前的所有字符。我认为使用 sed 命令可以做到这一点,并在 google 和 sed 手册页上进行了研究。但是,我只找到了显示如何格式化 sed 以删除每行中最后一个 n 字符的资源,这样做是这样的:

sed 's/.\{n\}$//'

我对 bash 还很陌生,找不到有效的资源来了解如何格式化 sed 命令。有谁知道如何更改此命令以仅打印每行的最后 7 个字符

【问题讨论】:

    标签: linux bash shell sed


    【解决方案1】:

    没有sed,你可以使用cut

    cut -c -7 file
    

    awk:

    awk '{print (substr($0,length($0)-7+1))}' file
    

    【讨论】:

      【解决方案2】:

      如果文件名是file1,file2,file3......filen 然后使用

      sed -i 's,.*\(.\{7\}\)$,\1,' file*
      

      for i in file*; do
         sed -i 's,.*\(.\{7\}\)$,\1,' $i
      done
      

      但在使用 -i 时要小心。它会更改输入文件。

      【讨论】:

      • 由于 -i 的使用仅特定于 GNU sed,因此您在 GNU sed 中也有 -E(或在非常旧的版本中使用 -r),因此不需要所有转义: sed -Ei 's,.*(.{7})$,\1,' file*。始终引用您的变量 - 使用 "$i",而不是 $i。如果我们在打高尔夫球 - 你不需要正则表达式中的 $ 锚。
      【解决方案3】:

      使用这个使用substr 的 Perl 单行代码。
      首先,为测试创建输入:

      cat > in_file <<EOF
      foo_bar_1234567
      1234567
      
      123456
      EOF
      

      打印in_file的每个字符串的最后7个字符:

      perl -lpe '$_ = substr $_, -7;' in_file > out_file
      

      输出:

      1234567
      1234567
      
      123456
      

      请注意,如果输入的字符少于 7 个,则仅打印可用的字符数。例如,对于 6 个字符,它只打印 6,对于一个空字符串输入,它打印空字符串。

      Perl 单行代码使用这些命令行标志:
      -e:告诉 Perl 查找内联代码,而不是在文件中。
      -p:循环输入一行一次,默认分配给$_。在每次循环迭代后添加print $_
      -l:在执行内联代码之前去除输入行分隔符(默认情况下 *NIX 上为"\n"),并在打印时附加它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 2022-10-23
        • 1970-01-01
        • 2023-03-16
        • 2013-06-16
        相关资源
        最近更新 更多