我需要删除文件中的所有数字,除了后面跟着的那些数字(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
不要在意消除空间。可以自己做。
答案 0 :(得分:2)
Sed不支持预测,但Perl支持。但是,您的正则表达式并不完全正确:在123RD
中,它与12
匹配(因为12
是一个数字序列,后面没有ST
或ND
或RD
;后跟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
已被删除。这是因为S
与s
不匹配。我们可以通过使正则表达式不区分大小写来解决这个问题:
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]|$)
对于不区分大小写的情况,我将大写和小写都包括在括号中。
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
使用换行符作为分隔符来解析每一行。在行尾添加换行符。如果换行符后面的字符串不是数字,则传递该字符串。如果换行符后面的字符串是序数,也会传递字符串。如果换行符后面的字符串是数字,请将其删除。在该行的末尾,删除换行符分隔符。