使用`sed`

时间:2016-06-01 10:13:03

标签: linux bash sed formatting

所以,我正在尝试删除此表中的数字后我从命令行格式化的标签。以下是原始表格数据,直接从相关文件中进行处理和粘贴:

File Path                   Line  Description
/home/nick/.bashrc             9         # TODO        Chop this into code import files
/home/nick/.bashrc           204         # TODO        Add $HOME/os-setup to OS installation disc
/home/nick/.bashrc           207         # TODO        Custom power actions don't work; system tray notifications

但是,当向管道添加最终sed命令时,会发生一些奇怪的行为。例如,请考虑下面的sed命令:

cat somefile.txt | column -tx -s : | sed -e 's/\([0-9]\{1,\}\)/\1/g'
File Path                   Line  Description
/home/nick/.bashrc             9         # TODO        Chop this into code import files
/home/nick/.bashrc           204         # TODO        Add $HOME/os-setup to OS installation disc
/home/nick/.bashrc           207         # TODO        Custom power actions don't work; system tray notifications

这将查找表格每行中的数字,然后将匹配项替换为正则表达式的第一部分。由于整个匹配用大括号括起来,这意味着没有任何变化,因为它被自己替换。

然而,当我尝试使用相同的sed命令时,我将\t字符(一个文字制表符)添加到匹配的正则表达式,sed输出似乎截断了数字匹配也!见下文:

cat somefile.txt | column -tx -s : | sed -e 's/\([0-9]\{1,\}\)\t/\1/g'
File Path                   Line  Description
/home/nick/.bashrc               # TODO        Chop this into code import files
/home/nick/.bashrc           20  # TODO        Add $HOME/os-setup to OS installation disc
/home/nick/.bashrc           20  # TODO        Custom power actions don't work; system tray notifications

为什么sed会截断每个数字的最后一位数?如何阻止sed这样做?

1 个答案:

答案 0 :(得分:1)

而不是在数字后删除标签,而是删除# TODO之前的空格。

awk(GNU)解决方案

awk '{print gensub(/[ ]+(  # TODO)/,"\\1","g",$0)} ' file

sed解决方案

sed -E 's/[ ]+# TODO/  # TODO/' file

<强>输出

File Path                   Line  Description
/home/nick/.bashrc             9  # TODO        Chop this into code import files
/home/nick/.bashrc           204  # TODO        Add $HOME/os-setup to OS installation disc
/home/nick/.bashrc           207  # TODO        Custom power actions don't work; system tray notification

<强>假设

说明始终以# TODO

开头

注意

您可以在选择# TODO之前放置所需数量的空格。我把两个。