【问题标题】:Split file content strings by dash using xargs使用 xargs 通过破折号拆分文件内容字符串
【发布时间】:2020-12-31 05:10:53
【问题描述】:

我需要读取一个文件并将每一行拆分为一个域和一个应用程序字符串

domain.com-backend
domain.com-frontend

对于每一行我需要调用一个 docker build 命令(回显只是为了查看命令):

cat $FILE | grep '-' | xargs -I {} echo docker build -t {full} -f apps/{domain}/{application}/Dockerfile .

所以在示例中我希望输出

docker build -t domain.com-backend -f apps/domain.com/backend/Dockerfile .
docker build -t domain.com-frontend -f apps/domain.com/frontend/Dockerfile .

【问题讨论】:

  • 为什么不使用while循环和read命令?
  • @DigvijayS 没想到。我需要在 CI 中调用命令,所以我之前使用了类似这样的东西作为一个衬里,而没有构建一个“真正的”脚本。
  • 是的,你可以写一行。更新我的答案
  • 使用 xargs 这么重要吗?为什么不使用 awk ?
  • 如果您使用 xargs,您可能会遇到难以阅读/修改的命令,为了修改参数,您必须执行以下操作:stackoverflow.com/questions/45895071/…。一个while循环也可以很容易地写成单行,如果这是你关心的,它是一样的。

标签: bash shell sh xargs


【解决方案1】:

你可以用这个循环来做:

while read -r x; do
    echo docker build -t "$x" -f "apps/${x/-/\/}/Dockerfile" .
done < "$FILE"

测试后删除echo

查看更多bash parameter expansion


如果您想首先过滤文件,例如那里有更多的行,你想先grep "-" 就像在你的例子中一样,你可以使用这种语法(仅限bash):

while read -r x; do
    echo docker build -t "$x" -f "apps/${x/-/\/}/Dockerfile" .
done < <(grep "-" "$FILE")

【讨论】:

    【解决方案2】:

    试试

    while IFS= read -r line
    do
      echo  docker build -t ${line} -f apps/$(cut -d'-' -f1  <<<${line})/$(cut -d'-' -f2 <<<${line})/Dockerfile .
    done < "${FILE}"
    

    演示:

    $while IFS= read -r line
    > do
    >   echo  docker build -t ${line} -f apps/$(cut -d'-' -f1  <<<${line})/$(cut -d'-' -f2 <<<${line})/Dockerfile .
    > done  < test.txt 
    docker build -t domain.com-backend -f apps/domain.com/backend/Dockerfile .
    docker build -t domain.com-frontend -f apps/domain.com/frontend/Dockerfile .
    $cat test.txt 
    domain.com-backend
    domain.com-frontend
    

    编辑:一个班轮

    while IFS= read -r line; do   echo  docker build -t ${line} -f apps/$(cut -d'-' -f1  <<<${line})/$(cut -d'-' -f2 <<<${line})/Dockerfile . ; done < "${FILE}"
    

    【讨论】:

      【解决方案3】:

      在阅读时在- 上拆分文件并调用您的命令:

      while IFS='-' read -r dom app; do
         docker build -t "$dom-$app" -f "apps/$dom/$app/Dockerfile .
      done < "$file"
      

      阅读:bashfaq how to read a file field by field

      或者你可以使用xargs,如果你愿意的话:

      sed 's/^\(.*\)-\(.*\)$/\1-\2 \1 \2/' "$file" |
      xargs -n3 sh -c 'docker build -t "$1" -f "apps/$2/$3/Dockerfile"' _
      

      甚至:

      sed 's@^\(.*\)-\(.*\)$@\1-\2 -f apps/\1/\2/Dockerfile@' "$file" |
      xargs -n3 docker build -t
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-03
        相关资源
        最近更新 更多