【问题标题】:Use awk to pattern matching使用 awk 进行模式匹配
【发布时间】:2017-07-21 04:55:41
【问题描述】:

我有一个这样的文件 hoge.txt:

case $1 in
[ $input = "q" ] && exit
if [ -s $filename ]    
if [ ! -f $1 -o -f $2 ]
echo $list
rm -f ${BKDIR}
BKDIR=/${HOME}/backup

我想查找所有字母变量,排除每个参数,例如“$1”,然后输出到这样的新文件:

$input
$filename
$list

我现在能做的最好的就是

cat hoge.txt | awk '{for(i=1;i<=NF;i++){ if($i=="$/[a-zA-Z]/"){print $i} } }'

但它不返回任何结果。

【问题讨论】:

  • 只有小写单词?
  • 大写和小写。我想排除任何不纯字母的内容:$HOME 可以,但 ${HOME} 将被排除。
  • 将 if 条件更改为 if($i~/^\$[a-zA-Z]+$/) ... 但是像 ${BKDIR} 这样的变量呢?那么HOME 中的BKDIR=/${HOME}/backup 呢?
  • @shift-e: 正是我上面提到的 Sundeep 的问题
  • @shift-e:如果您在bash 上下文中使用,变量$HOME${HOME} 字面意思是相同的。不知道为什么要排除后者

标签: regex linux awk sed


【解决方案1】:

对于这样一个简单的示例,您不需要使用Awk,只需使用-E 标志使用扩展的正则表达式支持,并使用-o 仅打印匹配的单词

grep -Eo '\$[a-zA-Z]+' file

产生

$input
$filename
$list

并使用重定向(&gt;) 运算符写入新文件

grep -Eo '\$[a-zA-Z]+' file > variablesList

(或)通过使用-i 启用不区分大小写标志来保存两个击键(在下面的 cmets 中建议)

grep -iEo '\$[a-z]+' file

【讨论】:

  • 这也是可能的:grep -iEo '\$[A-Z]+' file
  • @Cyrus:是的,最后节省了两个击键;)(i 新添加和a-z 删除)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
相关资源
最近更新 更多