我如何将 ##-## 空格改为 ##-## 制表符?

我如何将 ##-## 空格改为 ##-## 制表符?

我有一个以 2 个数字、一个破折号、2 个数字和一个空格开头的条目列表。例如(请注意数字后的空格):

87-17 

我需要将上面的内容改为87-17<tab>(其中<tab>代表实际的制表符)。我不知道该怎么写出来。我知道这很简单,但我对 Linux 一点也不熟悉,我只是一个低级的图形设计师……

答案1

您可以使用sed

sed -ir 's/^([0-9]{2}-[0-9]{2}) /\1\t/' file

解释

sed是一个“流编辑器”。可以将其视为一种主要用于编辑文本的简单编程语言。该-i选项允许您就地编辑文件。运行不带 的命令-i以确保它产生所需的结果(文件将保持不变),然后运行带有 的命令以-i保留更改。-r启用扩展的常规扩展,在这种情况下,可简化格式。

s/foo/bar/“替换运算符”。它将用 替换foo每行中的第一个bar。在这里,我们给它输入一个正则表达式,意思是“匹配行首 ( ^),然后是两个数字 ( [0-9]{2}),一个减号-,再匹配 2 个数字,然后是一个空格。因为这个模式在括号内,所以它被“捕获”并作为 提供\1。因此,命令将用其自身替换它,后面跟着一个制表符 ( \t)。

或者perl

perl -i -pe 's/(\d{2}-\d{2}) /\1\t/' file

解释

这与上面的非常相似,sed但使用的是perl另一种脚本语言。 的-i功能与 相同sed。的-p意思是“在应用给定的脚本后打印每一行” -e

替换运算符再次相同,只是这里我们可以使用\d数字的简写。

答案2

如果末尾有空格,则可以使用tr

< file tr ' ' '\t' > file1

或者sed

sed -i 's/ /\t/' file

如果还有其他不应替换的空间:

sed -i 's/ $/\t/' file

答案3

使用awk

  • 87-17<space>如果你的文件中确实只有类似这样的内容

    awk '/ $/ {printf "%s\t\n",$1}' foo > bar
    
  • 如果不

    awk '/[0-9][0-9]-[0-9][0-9] $/ {printf "%s\t\n",$1}' foo > bar
    

使用gawk

可能需要gawk先安装

sudo apt-get install gawk

在那之后

gawk '{print gensub(/^([0-9]{2}\-[0-9]{2})\s$/,"\\1\t","g")}' foo > bar

解释

  • ^断言字符串开头的位置

  • 第一捕获组([0-9]{2}\-[0-9]{2})

    • [0-9]{2}匹配下面列表中的单个字符

      量词:{2}恰好 2 次

      0-90 到 9 之间的单个字符

    • \-与字符-逐字匹配

    • [0-9]{2}匹配下面列表中的单个字符

      量词:{2}恰好 2 次

      0-90 到 9 之间的单个字符

    • \s匹配任何空白字符[\r\n\t\f ]

    • $断言字符串末尾的位置

答案4

您可以使用tr转换字符。在下面的例子中,我将空格转换为制表符。

echo '22-12 11-12' | tr ' ' '\t'
22-12   11-12

相关内容