【问题标题】:How can I extract a portion of a string into a variable in a bash shell script?如何将字符串的一部分提取到 bash shell 脚本中的变量中?
【发布时间】:2013-06-27 01:50:14
【问题描述】:

我有一个 Eclipse .classpath 文件,其中包含许多行,例如

<classpathentry kind="lib" path="/somepath/somelibrary.jar"/>

我的目的是编写一个 bash 脚本来解析每一行以测试该库是否存在。对于奖励积分,因为我知道我的机器上可能存在库的备用位置,如果在类路径文件指定的位置中找不到,我也会搜索备用位置并尽可能修复类路径文件。

我该怎么做?

似乎How can I extract part of a string via a shell script? 是相关的,但不确定如何将其转换为类似的格式

#!/bin/sh
while read f
do
   if [ -f $f ]
   then
      echo "Found: $f"
   else
      echo "Missing: $f"
   fi
done < $1

我认为这是我的目标。

【问题讨论】:

  • 我可以推荐python、ruby、PHP...吗?
  • 正如@KarolyHorvath 所提到的,使用python、ruby、php 和其他解决方案可能会更好。 Bash 可能不是解析 xml 的最理想方式。由于.classpath 恰好是xml 格式,您可能可以使用xpath。您可以尝试使用 xpath -q -e classpath/classpathentry[@kind=\"lib\"]/@path &lt;classpath_file&gt; |cut -d '=' -f2|tr -d '"' 或更好的东西来获取路径列表
  • 说实话,我很乐意用任何语言来做这件事。我对完成这项工作所提到的任何人都不熟悉(或不够熟悉)。也许你可以为我所追求的任务提出一个解决方案......很高兴验证你的工作:) 我目前正在寻找 bash 版本,并将很快用我的脚本的当前状态更新这个问题。

标签: bash shell sed awk grep


【解决方案1】:
sed -n 's/.*path="\([^"]*\)".*/\1/p' file |
while IFS= read -r file
do
   if [ -f "$f" ]
   then
      echo "Found: $f"
   else
      echo "Missing: $f"
   fi
done

它不适用于包含换行符或双引号的文件名。如果您有其中任何一个,请告诉我们。

【讨论】:

  • 如果是标准XML,双引号会被编码为&amp;quot;
【解决方案2】:

首先使用egrep 从类路径文件中获取 jar 路径,然后遍历每个路径。

for f in $(egrep -o '[/a-zA-Z0-9]+\.jar' .classpath); do
   if [ -f $f ]
   then
       echo "Found: $f"
   else
      echo "Missing: $f"
  fi
done

【讨论】:

    猜你喜欢
    • 2015-10-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-09
    • 2022-01-09
    • 1970-01-01
    • 2020-03-27
    • 2021-02-12
    • 1970-01-01
    相关资源
    最近更新 更多