我在文件中有如下几行
....... DisplayName="john" ..........
Run Code Online (Sandbox Code Playgroud)
其中....
表示其他字段的可变数量。
使用以下 grep 命令,我能够提取具有有效“DisplayName”字段的所有行:
grep DisplayName="[0-9A-Za-z[:space:]]*" e:\test
Run Code Online (Sandbox Code Playgroud)
但是,我希望只从每一行中提取名称(即“john”),而不是从 grep 返回的整行中提取。我尝试将输出通过管道传输到cut
命令中,但它不接受字符串分隔符。
这对我有用:
awk -F "=" '/DisplayName/ {print $2}'
Run Code Online (Sandbox Code Playgroud)
返回"john"
. 要删除要john
使用的引号:
awk -F "=" '/DisplayName/ {gsub("\"","");print $2}'
Run Code Online (Sandbox Code Playgroud)
具体来说:
sed 's/.*DisplayName="\(.*\)".*/\1/'
Run Code Online (Sandbox Code Playgroud)
应该这样做,sed 语义是 s/subsitutethis/forthis/ 其中“/”是分隔符。转义括号与转义 1 组合用于保留括号指定的模式部分。该表达式将显示名称后面的所有内容保留在括号内,并丢弃其余部分。
如果您使用以下命令,则无需先使用 grep 也可以工作:
sed -n 's/.*DisplayName="\(.*\)".*/\1/p'
Run Code Online (Sandbox Code Playgroud)
-n 选项和 p 标志告诉 sed 仅打印更改的行。
更多信息: http: //www.grymoire.com/Unix/Sed.html