所有,我正在尝试运行一个sed
命令来从某些文件中删除卡号。我试图在单行中做到这一点,我认为一切进展顺利 - 但我意识到如果我的第一个替代品与模式不匹配,它会继续进入下一个命令。如果没有匹配,有没有办法让它退出?
我们的系统上有 16-22 长度的卡号,所以我写这个时考虑到了可变长度。我的规范是保留任何 16+ 位数字的前 6 位和后 4 位,并且将中间的任何内容都去掉(星号)。
sed 'h;s/[0-9]\{6\}\([0-9]\{5\}\)\([0-9]*\)[0-9]\{4\}/\1\2/;s/./*/g;x;s/\([0-9]\{6\}\)[0-9]*\([0-9]\{4\}\)/\1\2/;G;s/\n//;s/\([0-9]\{6\}\)\([0-9]\{4\}\)\(.*\)/\1\3\2/'
问题在于如果这部分命令:
s/[0-9]\{6\}\([0-9]\{5\}\)\([0-9]*\)[0-9]\{4\}/\1\2/
什么也没找到,模式空间仍然是输入。它继续到下一个命令,然后用星号替换所有内容。我最终得到的是输入后跟相同数量的星号(如果它与我的第一个替代品中的“卡号资格”不匹配)。如果它被认为是可能的卡号,它就可以完美地工作。
有任何想法吗?