使用 xargs 按破折号拆分文件内容字符串

Split file content strings by dash using xargs

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

domain.com-backend
domain.com-frontend

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

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 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}"

你可以用这个循环来完成:

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")

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

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/^\(.*\)-\(.*\)$/-  /' "$file" |
xargs -n3 sh -c 'docker build -t "" -f "apps///Dockerfile"' _

甚至:

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