sed查找文件中出现的模式
我有一个带有标签的csv文件,格式为…,fxx=sth,。。。并希望检查每个字段可以接受哪些字段值。目前我使用:sed查找文件中出现的模式,sed,pattern-matching,Sed,Pattern Matching,我有一个带有标签的csv文件,格式为…,fxx=sth,。。。并希望检查每个字段可以接受哪些字段值。目前我使用: cat data.csv | grep "f10=" | sed 's/.*\(f10=[^,]*\).*/\1/g' | sort | uniq 但是,这只会给出每行的最后一个匹配项,例如,如果一行有…,f10=a,…,f10=b,…,那么我将始终只获得第二个匹配项 有更好的方法吗?如果行以逗号结尾 sed -e 's/,f10=/,X=/g' -e 's/f[0-9]*=[^,
cat data.csv | grep "f10=" | sed 's/.*\(f10=[^,]*\).*/\1/g' | sort | uniq
但是,这只会给出每行的最后一个匹配项,例如,如果一行有…,f10=a,…,f10=b,…
,那么我将始终只获得第二个匹配项
有更好的方法吗?如果行以逗号结尾
sed -e 's/,f10=/,X=/g' -e 's/f[0-9]*=[^,]*,*//g' -e 's/X=/f10=/' data.csv
(如果不是以逗号结尾,那么就在末尾加上“
-e's/,$/”
)如果行以逗号结尾
sed -e 's/,f10=/,X=/g' -e 's/f[0-9]*=[^,]*,*//g' -e 's/X=/f10=/' data.csv
(如果不是以逗号结尾,那么就在结尾加上“
-e's/,$/”
)如果允许使用perl而不是sed:
grep f10= data.csv | perl -e 'for(<>){ @f=/f10=[^,]+/g; print "@f\n" }' |
sort | uniq
grep f10=data.csv | perl-e'for(){@f=/f10=[^,]+/g;打印“@f\n”}”|
排序| uniq
以下是perl脚本的作用:
循环通过从STDIN获得的行for()
匹配您的正则表达式,@f=/f10=[^,]+/g
,并将所有出现的内容存储在/f10=[^,]+/
数组中@f
将print“@f\n”
数组的内容打印为由空格和换行符分隔的字符串@f
grep f10= data.csv | perl -e 'for(<>){ @f=/f10=[^,]+/g; print "@f\n" }' |
sort | uniq
grep f10=data.csv | perl-e'for(){@f=/f10=[^,]+/g;打印“@f\n”}”|
排序| uniq
以下是perl脚本的作用:
循环通过从STDIN获得的行for()
匹配您的正则表达式,@f=/f10=[^,]+/g
,并将所有出现的内容存储在/f10=[^,]+/
数组中@f
将print“@f\n”
数组的内容打印为由空格和换行符分隔的字符串@f
,
分离的csv,因此您可能需要:
tr "," "\n" FILE | sed -n '/^f[0-9]\+=/p' | sort | uniq -c
tr
将分隔符转换为新行,sed
过滤掉没有fXX=
部分的行,然后对其进行排序、区分
HTH如果我理解正确,它是一个
,
分离的csv,因此您可能需要:
tr "," "\n" FILE | sed -n '/^f[0-9]\+=/p' | sort | uniq -c
tr
将分隔符转换为新行,sed
过滤掉没有fXX=
部分的行,然后对其进行排序、区分
HTH你能发布一个csv的小样本/片段吗?可能是因为。。。Otheret
Fxx=sth
将被最后一个f10=
匹配项替换。所以,最好是通过,
分隔行,然后只获取f10=部分。你能发布csv的一个小样本/片段吗?可能是因为。。。OtheretFxx=sth
将被最后一个f10=
匹配项替换。因此,最好是通过,
分隔行,然后只获取f10=部分。