【问题标题】:Sed not matching one or more patternsSed 不匹配一个或多个模式
【发布时间】:2018-04-30 08:25:12
【问题描述】:

我有这个文件列表:

$ more files
one_this_2017_1_abc.txt
two_that_2018_1_abc.txt
three_another_2017_10.abc.txt
four_again_2018_10.abc.txt
five_back_2018_1a.abc.txt

我想得到这个输出:

one_this_XXXX_YY_abc.txt
two_that_XXXX_YY_abc.txt
three_another_XXXX_YY.abc.txt
four_again_XXXX_YY.abc.txt
five_back_XXXX_YY.abc.txt

我正在尝试删除年份和年份之后的位并用另一个字符串替换它们——这是为了生成测试用例。

我可以很好地获得年份,但它之后的一两个字符部分我似乎无法匹配。

应该工作,对吧?

~/test_cases
$ cat files | sed -e 's/_[[:digit:]]\{4\}_/_XXXX_/' -e 's/_[[:alnum:]]\{1,2\}_/_YY_/'
one_this_XXXX_YY_abc.txt
two_that_XXXX_YY_abc.txt
three_another_XXXX_10.abc.txt
four_again_XXXX_10.abc.txt
five_back_XXXX_1a.abc.txt

除非它不适用于 2 个字符的情况。

$ cat files | sed -e 's/_[[:digit:]]\{4\}_/_XXXX_/' -e 's/_[[:alnum:]]\
{2\}_/_YY_/'
one_this_XXXX_1_abc.txt
two_that_XXXX_1_abc.txt
three_another_XXXX_10.abc.txt
four_again_XXXX_10.abc.txt
five_back_XXXX_1a.abc.txt

也不适用于两种字符情况,而且这根本不起作用(但根据文档应该):

$ cat files | sed -e 's/_[[:digit:]]\{4\}_/_XXXX_/' -e 's/_[[:alnum:]]\+_/_YY_/'
one_YY_XXXX_1_abc.txt
two_YY_XXXX_1_abc.txt
three_YY_XXXX_10.abc.txt
four_YY_XXXX_10.abc.txt
five_YY_XXXX_1a.abc.txt

其他无效的随机实验:

$ cat files | sed -e 's/_[[:digit:]]\{4\}_/_XXXX_/' -e 's/_[a-zA-Z0-9]\+_/_YY_/'
one_YY_XXXX_1_abc.txt
two_YY_XXXX_1_abc.txt
three_YY_XXXX_10.abc.txt
four_YY_XXXX_10.abc.txt
five_YY_XXXX_1a.abc.txt

$ cat files | sed -e 's/_[[:digit:]]\{4\}_/_XXXX_/' -e 's/_[a-zA-Z0-9]\{1\}_/_YY_/'
one_this_XXXX_YY_abc.txt
two_that_XXXX_YY_abc.txt
three_another_XXXX_10.abc.txt
four_again_XXXX_10.abc.txt
five_back_XXXX_1a.abc.txt

$ cat files | sed -e 's/_[[:digit:]]\{4\}_/_XXXX_/' -e 's/_[a-zA-Z0-9]\{2\}_/_YY_/'
one_this_XXXX_1_abc.txt
two_that_XXXX_1_abc.txt
three_another_XXXX_10.abc.txt
four_again_XXXX_10.abc.txt
five_back_XXXX_1a.abc.txt

尝试在 Linux 下使用 GNU sed 4.2.1 版和在 Cygwin 下使用 sed (GNU sed) 4.4。

是的,我意识到我可以通过多个 sed 调用来传递它以使其工作,但是那个正则表达式应该工作,对吧?

【问题讨论】:

  • 请在您的问题中添加示例输入和该示例输入所需的输出。
  • 样本输入在那里——我只是把它格式化得很糟糕。我将添加应该是输出的内容。

标签: sed


【解决方案1】:

如果您的 Input_file 与所示示例相同,那么以下内容可能对您有所帮助。

sed 's/\([^_]*\)_\([^_]*\)_\(.*_\)\(.*\)/\1_\2_XXXX_YY_\4/g'   Input_file

输出如下。

one_this_XXXX_YY_abc.txt
two_that_XXXX_YY_abc.txt
three_another_XXXX_YY_10.abc.txt
four_again_XXXX_YY_10.abc.txt
five_back_XXXX_YY_1a.abc.txt

【讨论】:

  • 这个相同的正则表达式将用于文件名验证以及转换,并且文件名(在这种情况下)更规则。我更关心的是理解我在 \{1,2\} 和 \+ 位上做错了什么,而不是解决这个具体案例。
猜你喜欢
  • 2020-08-04
  • 2013-03-10
  • 1970-01-01
  • 1970-01-01
  • 2021-04-02
  • 2015-05-07
  • 2012-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多