【问题标题】:bash - searching for a text in a file and storing it into a variablebash - 在文件中搜索文本并将其存储到变量中
【发布时间】:2012-01-02 07:38:33
【问题描述】:

我正在尝试在文件中搜索文本并将其存储到变量中。

我的文件看起来像这样:

Type: Furniture
Color: Blue
Version: 1

我正在尝试搜索版本号并将其存储到变量中并增加它。当我搜索文件时,我不知道这个号码。到目前为止,我有这样的事情。

VERSIONNUMBER=//Somehow I want to get the version # from the file. 
VERSIONNUMBER=`expr $VERSIONNUMBER + 1'

sed -i "s/Version:.*/Version=$VERSIONNUMBER/" filename

到目前为止,我在正确的轨道上还是有更好的方法?我在搜索版本号时遇到问题。我不断收到语法错误。非常感谢任何帮助。

VERSIONNUMBER=`sed -i "s/Version:/*" filename`

【问题讨论】:

    标签: bash scripting sed


    【解决方案1】:

    这是 awk 的工作

     awk '/Version:/{$2++}1' ./infile > ./outfile
    

    示例

    $ awk '/Version:/{$2++}1' ./infile
    Type: Furniture
    Color: Blue
    Version: 2
    

    说明

    /Version:/ 仅匹配包含文本“版本:”的行

    $2++: 获取第二个字段,awk默认用空格分隔,然后递增

    {...}1:在 awk 进行任何更改后告诉 print 的捷径

    【讨论】:

    • 更准确地说,1 是一种新模式,它始终为真,默认操作为print $0。 (Awk 脚本是 pattern / action 对的序列。)因此,awk 1 /etc/passwdcat /etc/passwd 的较慢变体。
    • 谢谢,非常清楚的解释!这正是我想要做的,只是它要简单得多。我似乎无法将更新的版本存储回同一个文件中,所以我打算像你建议的那样通过管道传输./infile > ./outfile,然后用新的./outfile 替换旧的./infile。再次感谢!
    • @user459811 是的,awk 不支持像sed -i 这样的就地编辑。但请注意,sed -i 不可移植,它是 GNUism。正如我确定的那样,您可能已经发现,如果您尝试将文件重定向到自身,您最终会冲洗文件。您需要手动复制它。
    • 我以前没有见过这个成语,所以我需要弄清楚它是如何工作的,看看它是否可以移植到所有版本的 awk 中。我相信它是完全便携的。
    • @JonathanLeffler 是的,它应该是可移植的。我经常看到的另一个成语是{$1=$1},如果您只想更改其中一个分隔符。我今天才用过那个here。出于某种原因,awk 不会更改分隔符,除非它认为它对其中一个字段进行了更改。
    【解决方案2】:

    如果你想原地覆盖文件,那么你可以使用 Perl 而不是 Awk。

    perl -i.bak -p -e 's/^(Version: )(\d+)/$x=$2+1,"$1$x"/e' "$@"
    

    .bakfilename 的备份保存在filename.bak 中;如果您不想要备份,请从命令行中删除 .bak(但将 -i 保留在那里)。正则表达式上的 e 修饰符意味着将替换视为表达式。 $2 等值是只读的,因此将增加的值保存到 $x,然后将其用作字符串的一部分。逗号运算符先计算其 LHS,然后计算其 RHS。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多