sed查找文件中出现的模式

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]*=[^,

我有一个带有标签的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]*=[^,]*,*//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脚本的作用:

  • for()
    循环通过从STDIN获得的行
  • @f=/f10=[^,]+/g
    匹配您的正则表达式,
    /f10=[^,]+/
    ,并将所有出现的内容存储在
    @f
    数组中
  • print“@f\n”
    @f
    数组的内容打印为由空格和换行符分隔的字符串

如果允许您使用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脚本的作用:

  • for()
    循环通过从STDIN获得的行
  • @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的一个小样本/片段吗?可能是因为。。。Otheret
Fxx=sth
将被最后一个
f10=
匹配项替换。因此,最好是通过
分隔行,然后只获取f10=部分。