我有一个文件s.csv
a,b+ -.,c
aa,bb ().,c._c
我想从第二列(文件以逗号分隔)中删除所有特殊字符
cat s.csv | tr -dc '[:alnum:]nr' | tr '[:upper:]' '[:lower:]'
上面的代码也删除了第三列的特殊字符。
awk -F, '{print $2}' s.csv | tr -dc '[:alnum:]nr' | tr '[:upper:]' '[:lower:]'
这段代码只打印第二列。
我怎么能从第二列删除特殊字符和价格所有
所需输出应为
a,b,c
aa,bb,c._c
删除所有(从第二个字段)
- 非大写字母的字符
[^A-Z
- 或小写字母
a-z
- 或数字
0-9]
- 来自第二字段
$2
- 字段带有","分隔
-F ','
- 保留输出中的分隔符
OFS=FS
$ awk -F ',' 'BEGIN{OFS=FS}{gsub(/[^A-Za-z0-9]/,"",$2); print}' s.csv
# test
$ awk -F ',' 'BEGIN{OFS=FS}{gsub(/[^A-Za-z0-9]/,"",$2); print}' <<<'aa,bb ().,c._c'
aa,bb,c._c
正如下面提到的@ lsama Gris
不要忘记将区域设置设置为
C
或[^A-Za-z0-9]
出乎意料地用非西欧字母解释。预谋Awk调用LC_ALL=C
您可以使用awk
来使用[:alpha:]
字符类,这里是第二个字段,并使用gsub()
函数删除非alpha字符:
awk 'BEGIN{OFS=FS=","} {gsub(/[^[:alpha:]]+/, "", $2)} 1' file
a,b,c
aa,bb,c._c
- 如果你需要其他字符集,你可以看到Ed Morton的回答:https://stackoverflow.com/questions/56481541/how-can-you-tell-which-characters-are-in-which-character-classes并查看"哪些字符属于哪些字符类">
使用下面的Perl一行代码:
perl -F',' -lane '$F[1] =~ s{[W_]+}{}g; @F = map { lc } @F; print join ",", @F; ' in_file > out_file
Perl单行程序使用这些命令行标志:-e
:告诉Perl查找内联代码,而不是在文件中查找。-n
:每次循环输入一行,默认赋值给$_
。-l
:在执行内联代码之前剥离输入行分隔符(*NIX默认为"n"
),并在打印时附加它。-a
:根据空格或-F
选项中指定的regex将$_
拆分为数组@F
。-F','
:以逗号分隔为@F
,而不是以空格分隔。
s{[W_]+}{}
:用空替换出现1次或多次的W
(非单词字符)或下划线。
正则表达式使用以下修饰符:
/g
:重复匹配模式。参见:perldoc perlrun
:如何执行Perl解释器:命令行开关perldoc perlre
: Perl正则表达式(regexes)perldoc perlre
: Perl正则表达式(regexes):量词;字符类和其他特殊转义;断言;捕获组perldoc perlrequick
: Perl正则表达式快速入门
你不为了做到这一点,我不得不改变locale
-通过使用octals
代替字母,regex引擎将它们视为ASCII
,而不是过于聪明-我甚至故意将其设置为比利时法语来说明:
echo 'a,b+ -.,c
aa,bb ().,c._c' | {m,g}awk '
gsub("[^\060-\071\101-\132\141-\172]+","",$(!_+!_))^_'
OFS=',' FS=','
a,b,c
aa,bb,c._c
展示不需要LOCALE=C
LANG="fr_BE.UTF8" gawk -e '
BEGIN { for(_=8*4;_<8^4;_++) { printf("%c",_) } } ' |
LANG="fr_BE.UTF8" gawk -p- -e '
gsub("[^\060-\071\101-\132\141-\172]+","",$-_)^_' OFS=',' FS=','
——————————
0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
# profile gawk, cr'e'e Sun May 29 05:58:26 2022
# R`egle(s)
1 (gsub("[^\060-\071\101-\132\141-\172]+", "", $-_)) ^ _ { # 1
1 print
}