sed / awk正则表达式删除第一组括号

时间:2014-07-03 10:24:40

标签: regex awk sed

我对Unix很新,所以请耐心等待。我有以下格式的数百个文件,每个文件有数百行,但括号中的2个字母会因文件而异:

(SC)-ID             VARCHAR2(10)
(SC)-POLICY-NO      VARCHAR2(20)
(SC)-NAME           VARCHAR2(50)
(SC)-CODE           VARCHAR2(2)
(SC)-TERM           VARCHAR2(20)
(SC)-VAR-CODE       VARCHAR2(5)
(SC)-CONTRACT-TYPE  VARCHAR2(5)
POSTCODE            VARCHAR2(20)
....
....
....

我需要能够操作所有这些文件,以便删除第一组括号 导致:

SC-ID             VARCHAR2(10)
SC-POLICY-NO      VARCHAR2(20)
SC-NAME           VARCHAR2(50)
SC-CODE           VARCHAR2(2)
SC-TERM           VARCHAR2(20)
SC-VAR-CODE       VARCHAR2(5)
SC-CONTRACT-TYPE  VARCHAR2(5)
POSTCODE          VARCHAR2(20)
....
....
....

使用任何类型的全局替换(可以理解)导致从两行中删除两个括号组,例如。

sed 's/[()]//g'
awk -F" " '{gsub(/\(|\)/,"");print}'

但如果我不使用全球替代,例如

sed 's/[()]//g'
awk -F" " '{sub(/\(|\)/,"");print}'

它只是从每一行中删除第一个左括号,但只有它是指定的格式,即(alpha alpha)

有没有办法将正则表达式合并到我想要替换的内容中,因此只有(alpha alpha)被alpha alpha替换而所有其他括号都被忽略了?没有太多的意义来发布我的努力来合并任何正则表达式,因为它们要么删除所有字母字符,要么完全被忽略。

任何帮助非常感谢。感谢。

7 个答案:

答案 0 :(得分:1)

你的awk命令太近了,

awk '{gsub(/\(|\)/,"",$1);print}' file

要使输出格式与输入相同,然后将awk命令的输出提供给column -t

$ awk '{gsub(/\(|\)/,"",$1)}1' file | column -t
SC-ID             VARCHAR2(10)
SC-POLICY-NO      VARCHAR2(20)
SC-NAME           VARCHAR2(50)
SC-CODE           VARCHAR2(2)
SC-TERM           VARCHAR2(20)
SC-VAR-CODE       VARCHAR2(5)
SC-CONTRACT-TYPE  VARCHAR2(5)

另一个GNU sed技巧,

$ sed -r 's/\)//1;s/\(//1' file
SC-ID             VARCHAR2(10)
SC-POLICY-NO      VARCHAR2(20)
SC-NAME           VARCHAR2(50)
SC-CODE           VARCHAR2(2)
SC-TERM           VARCHAR2(20)
SC-VAR-CODE       VARCHAR2(5)
SC-CONTRACT-TYPE  VARCHAR2(5)

上面的sed命令仅删除第一列中的开放)和关闭(括号。

答案 1 :(得分:1)

这个sed可以完成这项工作:

sed -i.bak 's/(\([^)]*\))/\1/' file

答案 2 :(得分:1)

有人这样吗?

awk '/^\(/ {sub(/\(/,"");sub(/\)/,"")}1' file
SC-ID             VARCHAR2(10)
SC-POLICY-NO      VARCHAR2(20)
SC-NAME           VARCHAR2(50)
SC-CODE           VARCHAR2(2)
SC-TERM           VARCHAR2(20)
SC-VAR-CODE       VARCHAR2(5)
SC-CONTRACT-TYPE  VARCHAR2(5)
POSTCODE            VARCHAR2(20)
....
....
....

答案 3 :(得分:1)

这个简单的两分钱:

sed -i.bak -e 's/(//' -e 's/)//' file

或者正如约翰所说,这个清洁工:

sed -i.bak -e 's/(//;s/)//' file

答案 4 :(得分:1)

我建议你使用POSIX单字母图案,它会捕获大写和小写字符,但不会是数字。所以我的解决方案很简单:

sed 's/(\([[:alpha:]][[:alpha:]]\))/\1/g'

希望这有帮助!

答案 5 :(得分:0)

你可以尝试

sed 's/^(\([A-Z][A-Z]\))/\1/' filename

答案 6 :(得分:0)

使用perl:

perl -pe 's/^\((.*?)\)(.*)/$1$2/g' your_file

测试:

> cat temp2
(SC)-ID             VARCHAR2(10)
(SC)-POLICY-NO      VARCHAR2(20)
(SC)-NAME           VARCHAR2(50)
(SC)-CODE           VARCHAR2(2)
(SC)-TERM           VARCHAR2(20)
(SC)-VAR-CODE       VARCHAR2(5)
(SC)-CONTRACT-TYPE  VARCHAR2(5)
POSTCODE            VARCHAR2(20)

> perl -pe 's/^\((.*?)\)(.*)/$1$2/g' temp2
SC-ID             VARCHAR2(10)
SC-POLICY-NO      VARCHAR2(20)
SC-NAME           VARCHAR2(50)
SC-CODE           VARCHAR2(2)
SC-TERM           VARCHAR2(20)
SC-VAR-CODE       VARCHAR2(5)
SC-CONTRACT-TYPE  VARCHAR2(5)
POSTCODE            VARCHAR2(20)