我有一个以 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-9
0 到 9 之间的单个字符\-
与字符-
逐字匹配[0-9]{2}
匹配下面列表中的单个字符量词:
{2}
恰好 2 次0-9
0 到 9 之间的单个字符\s
匹配任何空白字符[\r\n\t\f ]
$
断言字符串末尾的位置
答案4
您可以使用tr转换字符。在下面的例子中,我将空格转换为制表符。
echo '22-12 11-12' | tr ' ' '\t'
22-12 11-12