【问题标题】:How to avoid leading space using cut command?如何使用 cut 命令避免前导空格?
【发布时间】:2019-01-18 16:42:54
【问题描述】:

要求:我只需要使用grep/cut/join

我有如下数据:

  3 abcd
 23 xyz
1234 abc

我想将此数据通过管道传输到cut,然后提取列。但是,当我使用cut -d' ' -f 1,2 时,它会将每个空间视为自己的列分隔符。我希望在cut 之前修剪前两行。有办法吗?

示例(我使用tr 来演示此处的空格位置;解决方案中不允许这样做):

$ echo '  3 abcd
23 xyz
1234 abc' | cut -d' ' -f 1,2 | tr ' ' '_'
_
_23
1234_abc

预期输出:

$3 abcd
23 xyz
1234 abc

【问题讨论】:

  • 将您尝试的内容显示为minimal reproducible example,以及结果输出。例如,您应该显示在此上下文中使用的 -d 选项。
  • @jdv 我已编辑。请看一看。
  • 有一个答案显示了一种可能的方法来按摩输入以删除带有“sed”的前导分隔符。如果您需要保留那些领先的分隔符,那么您将面临额外的挑战。这里还有其他提示:stackoverflow.com/q/4143252/1531971(虽然这里谈到了将多个分隔符压缩到一个分隔符,但同样的工具可以通过一些工作来按摩前导分隔符。)
  • 最后,我希望只有 3 abcd, 23 xyz,1234 abc
  • 在将 args 传递到 cut 之前去除前导空格。 unix.stackexchange.com/q/102008/156990

标签: cut


【解决方案1】:

仅使用grep,您可以通过以下管道完成此操作:

grep -oe "[^ ][^ ]*  *[^ ][^ ]*$"

grep    # a tool for matching text
  -o    # only prints out matching text
  -e    # uses a regex
  [^ ]  # match anything that isn't a space
  *     # match zero or more of the previous element
  $     # the end of the line

注意:这不考虑尾随空格。

演示:

$ echo '  3 abcd
 23 xyz
1234 abc' | grep -oe "[^ ][^ ]*  *[^ ][^ ]*$"
3 abcd
23 xyz
1234 abc

【讨论】:

  • 你能解释一下那个正则表达式吗
猜你喜欢
  • 1970-01-01
  • 2018-05-14
  • 2022-12-05
  • 2019-03-20
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多