我有一个文件" test.txt"在"版本"
之后,下面的行以及许多额外的东西egrep -r 'partition|is_active|state|is_default|composite' test.txt
我试过了:
partition="test",is_active="true",state="on",is_default="true",composite="test123"
partition="gello",is_active="true",state="on",is_default="true",composite="test234"
partition="bolo",is_active="true",state="on",is_default="true",composite="3415"
partition="solo",is_active="true",state="on",is_default="true",composite="hji"
它显示每一行,但我只需要如下所示的特定字段,忽略其余的数据/内容或行
在坚果壳中,我想只显示一行而不是其余的
{{1}}
答案 0 :(得分:4)
如果您的grep版本支持Perl风格的正则表达式,那么我将使用它:
grep -oP '.*?,\K[^}]+' file
删除第一个逗号前的所有内容(\K
将删除任何先前的输出)并将所有内容打印到}
。
或者,使用awk:
awk -F'}' '{ sub(/[^,]+,/, ""); print $1 }' file
这会将字段分隔符设置为}
,因此您感兴趣的部分是第一个字段。然后使用sub
将部分删除到第一个逗号。
为完整起见,您还可以使用sed:
sed 's/[^,]*,\([^}]*\).*/\1/' file
这会在第一个,
之后捕捉到}
之后的部分,并用它替换该行的内容。
答案 1 :(得分:3)
在grep
选择所需的行后,使用sed
修改这些行:
sed 's/.*\(partition[^}]*\)} map.*/\1/'
这意味着:"每当您看到任何.*
,然后是partition
和。{
任意数量的非}
,然后} map
以及其他任何内容,都可以获取该部分
从partition
到第1组,但不包括大括号\(...\)
。
替换文本只是第1组\1
。
使用管道|
将egrep
的输出连接到sed
的输入:
egrep ... | sed ...
答案 2 :(得分:1)
这可能适合你(GNU sed):
sed -r 's/(partition|is_active|state|is_default|composite)="[^"]*"/\n&\n/g;s/[^\n]*\n([^\n]*)\n[^\n]*/\1,/g;s/,$//' file
将问题视为“分解的俱乐部三明治”。确定馅料,取出面包并整理。
答案 3 :(得分:1)
据我所知,您的文件可能有更多行,您不想看,所以我会使用:
sed -n 's/.*\(partition.*\)}.*/\1/p' file
我们使用-n p
仅显示我们进行替换的行。替换部分只是得到你需要用模式替换整行的部分。