Sed Regex删除除序数以外的所有数字

时间:2018-05-25 15:31:56

标签: regex perl sed regex-lookarounds

我需要删除文件中的所有数字,除了后面跟着的那些数字(ST | TH | [RN] D)(序数)。我不知道如何在sed中引入异常(我知道[^]但是这不会让我给字符串可选(ST | TH | [RN] D)。

看起来可能是前瞻,但我的构造不起作用

s/[0-9][0-9]*(?!(ST|[RN]D))//g

示例输入:

12663 METRO CONDOMINIUM AS DESC IN INST# 200800031138 UNIT A
126TH AVENUE INDUSTRIAL PARK
13 AND 12-29-19
102-1st AVE CONDO

刚刚添加了最后一个,这是一个输入的doozy。我真的想消除前面的数字但是留下序数。 Revo的例子运作得很好。但这个边缘案例对我来说非常重要。

预期产出:

METRO CONDOMINIUM AS DESC IN INST#  UNIT A
126TH AVENUE INDUSTRIAL PARK
 AND --
-1st AVE CONDO

不要在意消除空间。可以自己做。

6 个答案:

答案 0 :(得分:2)

Sed不支持预测,但Perl支持。但是,您的正则表达式并不完全正确:在123RD中,它与12匹配(因为12是一个数字序列,后面没有STNDRD;后跟3)。

您可以通过向前瞻添加[0-9]来解决此问题:

perl -pe 's/[0-9][0-9]*(?!([0-9]|ST|[RN]D))//g'

此外,您不需要前瞻组中的内部捕获parens,XX*可以简化为X+,我们也希望排除TH:< / p>

perl -pe 's/[0-9]+(?![0-9]|ST|[RN]D|TH)//g'

测试输入的示例输出:

 METRO CONDOMINIUM AS DESC IN INST#  UNIT A
126TH AVENUE INDUSTRIAL PARK
 AND --
-st AVE CONDO

请注意,1中的1st已被删除。这是因为Ss不匹配。我们可以通过使正则表达式不区分大小写来解决这个问题:

perl -pe 's/[0-9]+(?![0-9]|ST|[RN]D|TH)//ig' test.txt
 METRO CONDOMINIUM AS DESC IN INST#  UNIT A
126TH AVENUE INDUSTRIAL PARK
 AND --
-1st AVE CONDO

答案 1 :(得分:0)

也许这会让你大部分都在那里:一系列数字后面没有字母数字字符或行尾

$ cat file
foo 1234 bar 32nd gaz 1234
1234hello

$ sed -E 's/[[:digit:]]+($|[^[:alnum:]])/\1/g' file
foo  bar 32nd gaz 
1234hello

答案 2 :(得分:0)

由于sed不支持外观,因此您必须使用以下方法定义每个路径:

[0-9]+(([sS]([^Tt]|$)|[Tt]([^Hh]|$)|[RNrn]([^Dd]|$))|[^RNSTrnst0-9]|$)

Live demo

对于不区分大小写的情况,我将大写和小写都包括在括号中。

GNU sed命令(POSIX ERE):

sed -r 's/[0-9]+(([sS]([^Tt]|$)|[Tt]([^Hh]|$)|[RNrn]([^Dd]|$))|[^RNSTrnst0-9]|$)/\1/g' file

正则表达式细分:

[0-9]+ # Match digits
( # Start of Capturing Group #1
    ( # Start of Capturing Group #2
        [sS] # Match S or s
        ( # Start of Capturing Group #3
            [^Tt] # If a character exists after S it shouldn't be T
            | # Or
            $ # Match end of line position
        ) # End of Capturing Group #3
        | # Or 
        [RNrn] # Match a letter from set
        ( # Start of Capturing Group #4
            [^Dd] # If a character exists after R or N it shouldn't be D
            | # Or
            $ # Match end of line position
        ) # End of Capturing Group #4
    ) # End of Capturing Group #2
    | # Or
    [^RNSrns0-9] # Match a letter from other than one in set
    | # Or
    $ # Match end of line position
) # End of Capturing Group #1

答案 3 :(得分:0)

sed用于单个行上的简单替换(例如import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import org.junit.Before; import org.junit.Test; import org.openqa.selenium.Dimension; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; public class ResponsiveWebTest { public WebDriver driver; public List<Dimension> screenDimensionsList; @Before public void beforeTestMethod(){ // create list of dimensions for various screen sizes screenDimensionsList = new ArrayList<Dimension>(); screenDimensionsList.add(new Dimension(1600,800)); screenDimensionsList.add(new Dimension(1200,800)); screenDimensionsList.add(new Dimension(992,800)); screenDimensionsList.add(new Dimension(768,800)); screenDimensionsList.add(new Dimension(480,800)); screenDimensionsList.add(new Dimension(360,800)); // initialize the driver for browser driver = new ChromeDriver(); driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS); driver.get("http://nandal.in"); } @Test public void testVariousScreenSizes(){ for(Dimension d: screenDimensionsList){ driver.manage().window().setSize(d); // run some test cases for this screen size // some test case steps try{ Thread.sleep(2000); }catch(Exception e){ e.printStackTrace(); } } } } ),即全部。对于其他任何你应该使用awk。使用GNU awk进行多字符RS,RT和IGNORECASE:

s/old/new/

答案 4 :(得分:0)

使用sed和输入文件

sed -E 's/(\<[0-9]+\>)//g' infile

<强>输出

 METRO CONDOMINIUM AS DESC IN INST#  UNIT A
126TH AVENUE INDUSTRIAL PARK
 AND --
-1st AVE CONDO

答案 5 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/^/\n/;:a;s/\n([^0-9]+)/\1\n/;ta;s/\n([0-9]*(1st|2nd|3rd|[4-90]th))/\1\n/I;ta;s/\n[0-9]+/\n/;ta;s/\n//' file

使用换行符作为分隔符来解析每一行。在行尾添加换行符。如果换行符后面的字符串不是数字,则传递该字符串。如果换行符后面的字符串是序数,也会传递字符串。如果换行符后面的字符串是数字,请将其删除。在该行的末尾,删除换行符分隔符。