Sed不匹配一个或多个模式

Sed不匹配一个或多个模式,sed,Sed,我有以下文件列表: $ 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

我有以下文件列表:

$ 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
除了两个字符的情况下没有

$ 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/_[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调用来实现它,但是regex应该可以工作,对吗

如果您的输入文件与所示示例相同,则以下内容可能会在相同方面对您有所帮助

~/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
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

若您的输入文件与示例中所示的相同,则以下内容可能会在相同方面对您有所帮助

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\}和\+位的错误,而不是解决这个具体的问题。这个正则表达式将用于文件名验证和转换,并且文件名(在本例中)更规则。我更关心的是理解我在\{1,2\}和\+位上做错了什么,而不是解决这个具体案例。