我对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替换而所有其他括号都被忽略了?没有太多的意义来发布我的努力来合并任何正则表达式,因为它们要么删除所有字母字符,要么完全被忽略。
任何帮助非常感谢。感谢。
答案 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)