所以,我正在尝试删除此表中的数字后我从命令行格式化的标签。以下是原始表格数据,直接从相关文件中进行处理和粘贴:
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
这样做?
答案 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
之前放置所需数量的空格。我把两个。