【问题标题】:variable inside awk/sed in alias别名中的 awk/sed 中的变量
【发布时间】:2014-04-11 15:15:57
【问题描述】:

我想编写一个别名来打印文件夹中所有文件的特定行,即:
$ print_line 20 - 将打印文件夹中所有文件的第 20 行。

我花了一个小时在 .bashrc 中处理各种结构(下面的一些示例),有很多不同的转义,但到目前为止没有任何效果。感谢您的帮助。

alias a="for f in create*; do sed -n '\$1{p;q}' $f; done"

alias b="for f in create*; do awk 'NR==\$1{print $0}' $f; done"

function l { r=$(echo \'"$1"{p;q}\'); sed -n "$r" *; }

【问题讨论】:

  • 为什么? awk 'FNR==20' * 会像 print_line 20 * 一样简洁地做到这一点
  • 感谢您的评论,那也可以。很明显,我对 awk 和 shell 也不太熟悉。

标签: bash sed awk alias


【解决方案1】:

你可以试试这个,

printline() { for f in create*; do sed -n "$1{p;q}" $f; done ;}

【讨论】:

    【解决方案2】:

    bash 别名,与 csh 中的别名不同,不允许参数;见Make a Bash alias that takes a parameter?Passing argument to alias in bash,以及How to pass command line arguments to a shell alias?How do I include parameters in a bash alias?

    所以你需要一个函数。如果您有带有-s 开关的 GNU sed,以下将起作用:

       printline() { sed -ns "$1 p" create*;} 
    

    否则,稍微修改 sat 的好答案,使用 for 循环:

       printline() { for f in create*; do sed -n "$1 p" "$f"; done;}
    

    注意{ 后面的空格是必须的。在"$f" 中使用双引号可防止文件名包含错误字符,例如空格或星号。

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 1970-01-01
      • 2011-03-07
      • 2014-06-14
      • 1970-01-01
      相关资源
      最近更新 更多