Shell 哪个unix实用程序可以帮助我从文件中的行中提取特定字符

Shell 哪个unix实用程序可以帮助我从文件中的行中提取特定字符,shell,unix,sed,awk,grep,Shell,Unix,Sed,Awk,Grep,我有一个文件f1,其中包含以下数据: --- sc_swVersion_t isaPDAVersion = {0,4,0,0,0,34}; --- 我想从中提取大括号后面的前4个字符。有人能告诉我什么unix实用程序/shell命令可以做到这一点吗。说: cat f1 | grep isaPDAVersion | < Some utility> gives me 0400 cat f1 | grep isapdaversation |给我0400 或者更简单地说是呆呆地看着 g

我有一个文件f1,其中包含以下数据:

---
sc_swVersion_t isaPDAVersion = {0,4,0,0,0,34};
---
我想从中提取大括号后面的前4个字符。有人能告诉我什么unix实用程序/shell命令可以做到这一点吗。说:

cat f1 | grep isaPDAVersion | < Some utility> gives me 0400
cat f1 | grep isapdaversation |给我0400
或者更简单地说是呆呆地看着

gawk  '/isaPDAVersion/ {match($4,"([[:digit:]]),([[:digit:]]),([[:digit:]]),([[:digit:]])",a); {print a[1]a[2]a[3]a[4]}}' f1
或者更简单地说是呆呆地看着

gawk  '/isaPDAVersion/ {match($4,"([[:digit:]]),([[:digit:]]),([[:digit:]]),([[:digit:]])",a); {print a[1]a[2]a[3]a[4]}}' f1

你可以用sed来完成这一切

cat f1 | sed -ne "s/^.*isaPDAVersion[^{]*{\([^,]*,[^,]*,[^,]*,[^,]*\).*$/\1/p"

你可以用sed来完成这一切

cat f1 | sed -ne "s/^.*isaPDAVersion[^{]*{\([^,]*,[^,]*,[^,]*,[^,]*\).*$/\1/p"

您可以使用
sed

sed -n '/{/s/^.*{\([0-9]*\),\([0-9]*\),\([0-9]*\),\([0-9]*\).*$/\1\2\3\4/p' f1

您可以使用
sed

sed -n '/{/s/^.*{\([0-9]*\),\([0-9]*\),\([0-9]*\),\([0-9]*\).*$/\1\2\3\4/p' f1
GNU awk

gawk '
  match($0, /isaPDAVersion.*\{([^,]+),([^,]+),([^,]+),([^,]+),/, a) {
    printf("%s%s%s%s\n", a[1], a[2], a[3], a[4])
  }
' f1
GNU awk

gawk '
  match($0, /isaPDAVersion.*\{([^,]+),([^,]+),([^,]+),([^,]+),/, a) {
    printf("%s%s%s%s\n", a[1], a[2], a[3], a[4])
  }
' f1
简短答复:

echo "sc_swVersion_t isaPDAVersion = {0,4,0,0,0,34};" | cut -f2 -d\{ | cut -f1-4 -d, | tr -d ,
用“cat文件名”替换回显。瞧,简短回答:

echo "sc_swVersion_t isaPDAVersion = {0,4,0,0,0,34};" | cut -f2 -d\{ | cut -f1-4 -d, | tr -d ,
用“cat文件名”替换echo,瞧。

真恶心。只需使用Perl

perl -nE's/\D//g,print for@{[split/,/]}[0..3]'
^不需要滚动。

真恶心。只需使用Perl

perl -nE's/\D//g,print for@{[split/,/]}[0..3]'


^无需滚动。

开头大括号后的前四个字符是
0,4,
;你说你想要
0400
。什么算是“角色”?如果你曾经
cat
ing到
grep
你做错了。@Evan:cat和grep@Karungrep接受一个filename参数
grep-isaPDAVersion f1
cat f1 | grep-isaPDAVersion
相同,只是前者效率更高、速度更快。@Evan感谢您指出“大括号后的前四个字符”是
0,4,
;你说你想要
0400
。什么算是“角色”?如果你曾经
cat
ing到
grep
你做错了。@Evan:cat和grep@Karungrep接受一个filename参数
grep isaPDAVersion f1
与猫f1一样| grep isaPDAVersion不同之处在于前者效率更高、速度更快。@Evan感谢您指出这一点,谢谢a ton Smith:)为了实现这一点,我与sed断绝了关系。是否有一个可以应用sed和awk的经验法则。奇怪的是,当我运行这个(使用
$1
)时,我得到
sc\u swVersion\t isaPDAVersion={0400
同时使用
mawk
gawk
。你使用哪个版本?另一个用户编辑添加了$1。我已经修复了它。除了使用cat之外,还有什么替代方法呢?awk和sed都将文件名作为参数,你不必通过管道连接到它们。这很管用,多亏了ton Smith:)我用sed to ac打破了我的头脑hieve it.是否有一个可以应用sed和awk的经验法则。奇怪的是,当我运行这个(使用
$1
)时,我得到
sc\u swVersion\t isaPDAVersion={0400
同时使用
mawk
gawk
。您使用哪个版本?另一个用户编辑添加了$1。我已经修复了它。除了使用cat之外,还有什么替代方法?awk和sed都将文件名作为参数,您不必通过管道连接到它们。