【问题标题】:sed: Delete all characters until first alphanumeric charactersed:删除所有字符,直到第一个字母数字字符
【发布时间】:2016-01-22 19:17:44
【问题描述】:

我的输入看起来像:

    -|+ string1
   IAmString2-OrAmI\ \   \
\ - 3string3+string4

我希望输出是:

string1
IAmString2-OrAmI\ \   \
3string3+string4

换句话说,我想读取字符串的开头,直到遇到一个字母数字字符,然后从该字符向前打印出字符串的其余部分,无论其内容如何。

我最接近:

sed -n 's/[[:alnum:]]/&\n/;s/.*\n//p'

但这删除了 ​​ 并包括第一个字母数字字符,所以我得到的输出看起来像:

tring1
AmString2-OrAmI\ \  \
string3+string4

有什么想法吗?我对任何可以使用 bash 脚本的东西持开放态度。

【问题讨论】:

  • 我想知道为什么这被否决了?它有明确的要求、样本输入、预期输出和尝试的解决方案。我们还能要求什么?赞成反对。
  • 这个问题清楚地表明了研究工作并清楚地解释了问题,所以我也赞成。看到新用户提出好的问题令人耳目一新。欢迎,理查德!

标签: regex shell awk sed


【解决方案1】:
$ sed 's/^[^[:alnum:]]*//' file
string1
IAmString2-OrAmI\ \   \
3string3+string4

【讨论】:

  • 吉布斯。你知道吗,我试过这个,只是我忘记了星号。谢谢,埃德。
【解决方案2】:

如果您使用的是 GNU sed,以下应该可以工作:

sed 's/^\W*//'

这将表达式锚定在行的开头并匹配零个或多个连续的非Word字符,用空字符串替换它们。请注意,word 字符包括所有字母数字字符和下划线。因此,不幸的是,如果开头的非字母数字字符中有下划线,这将不起作用(感谢 Ed)。

我发现上面的语法更容易输入(和记住),但它不像 Ed 的回答那样与 POSIX 兼容(可移植到其他系统)。

【讨论】:

  • @EdMorton 发现得很好。我忘记了下划线字符也被视为 word 字符。我会在我的答案中添加这个附带条件。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-02
  • 2015-03-24
  • 1970-01-01
  • 2013-11-29
  • 1970-01-01
相关资源
最近更新 更多