【问题标题】:Take parts of a string and create separate variables in bash获取字符串的一部分并在 bash 中创建单独的变量
【发布时间】:2015-02-27 22:05:24
【问题描述】:

我想取这个字符串:

t.mysite\/images\/test\/m\/[mike]_Original_Work_-_summer\/thumbs\/001.thumb.jpg","\/\/t.mysite\/images\/manga\/m\/[mike]_Original_Work_-_summer\/thumbs\/002.thumb.jpg","\/\/t.mysite\/images\/manga\/m\/[mike]_Original_Work_-_summer\/thumbs\/003.thumb.jpg"];

把它分开,这样我就有了:

var1 = "t.mysite/images/test/m/[mike]_Original_Work_-_summer/images/001.jpg"
var2 = "t.mysite/images/test/m/[mike]_Original_Work_-_summer/images/002.jpg"
var3 = "t.mysite/images/test/m/[mike]_Original_Work_-_summer/images/003.jpg"

然后 wget 每个变量。

如果可能的话,将获取的文件添加到另一个目录,比如 /home/mike/Pictures。

提前谢谢:)

【问题讨论】:

  • 关于原始字符串的格式,它是某种公认的格式,比如 python 数组或其他什么?
  • 我的意思是,有没有可能会有序列"," inside一些URL?
  • 它看起来几乎像 JSON,但它缺少开头的 ["。你抄对了吗?
  • 网址中不会有“,”
  • 如果真的是JSON,看看jq

标签: arrays string bash variables wget


【解决方案1】:

有很多方法可以做到这一点。使用参数扩展和子字符串提取以及子字符串替换是一种将字符串解析为单独变量的简单方法。以下键关闭字符串之间的","// 分隔符。只要您提供格式相同的行,以下内容将按要求将原始行分成 3 个变量:

#!/bin/bash

str='t.mysite\/images\/test\/m\/[mike]_Original_Work_-_summer\/thumbs\/001.thumb.jpg","\/\/t.mysite\/images\/manga\/m\/[mike]_Original_Work_-_summer\/thumbs\/002.thumb.jpg","\/\/t.mysite\/images\/manga\/m\/[mike]_Original_Work_-_summer\/thumbs\/003.thumb.jpg"];'

var1=${str%%\"*}         # remove from rt. to first " (substring extraction)
var1=${var1//\\/}        # remove all \               (substring replacement)

var2=${str//\\/}         # remove all \                      (ss replacement)
var2=${var2#*\",\"\/\/}  # remove up to first ","// from lt. (ss extraction)
var2=${var2%%\"*}        # remove all to first " from rt.    (ss extraction)

var3=${str//\\/}         # remove all \                     (ss replacement)
var3=${var3##*\",\"\/\/} # remove up to last ","// from rt. (ss extraction)
var3=${var3%%\"*}        # remove all to first " from rt.   (ss extraction)

echo "var1: $var1"       # output variables
echo "var2: $var2"
echo "var3: $var3"

exit 0

输出:

$  bash parsestr.sh
var1: t.mysite/images/test/m/[mike]_Original_Work_-_summer/thumbs/001.thumb.jpg
var2: t.mysite/images/manga/m/[mike]_Original_Work_-_summer/thumbs/002.thumb.jpg
var3: t.mysite/images/manga/m/[mike]_Original_Work_-_summer/thumbs/003.thumb.jpg

【讨论】:

  • 谢谢,看起来它与我正在寻找的内容很接近,但是它需要自动化。字符串可能更长或更短,用户(我)并不总是知道 str 是什么。例如,我在那个字符串中只给了你 3 个 url,但它可能多达 26 个甚至 100 个并删除 .thumb 部分(所以我猜是某种循环)然后为每个创建的变量提供一个简单的 wget。谢谢。
  • @MichaelBullock :StackOverflow 不是免费的编码服务。 David 在这里为您提供了一套出色的工具,您必须尝试使用​​它们。或者您在一个命令中处理 100 多个 URL 的要求是新的并且超出范围。祝你好运。
【解决方案2】:

我编写了以下脚本:(不要相信此处突出显示的语法;"$(command)" 内部命令中的引号 " 不会破坏外部引号)

string='["sd\"fg","dgf","dsfgsdfg\\sdfg"];'
echo "\$string is $string"

#strip off the initial [" and ending "];
string="$(echo $string | sed -r 's:^\s?\[?\s?"?::' | sed -r 's:"?\s?\]?\s?;?\s?$::')"
echo "\$string is $string"

echo
while [[ $string ]]; do
    url=$(echo $string |
          sed -r 's:^((\\"|\\\\|\\/|[^"])*).*:\1:' | # take just the first url
          sed -r 's:\\":":g' | sed -r 's:\\/:/:g' | sed -r 's:\\\\:\\:g' # clean it from any \"
         )
    echo "url is \"$url\""
    # do what you want with $url

    # remove the first url from the string
    string="$(echo $string | sed -r 's:^((\\"|\\\\|[^"])*)::' | sed -r 's:^","::')"
done

在我的系统中,输出是:

$string is ["sd\"fg","dgf","dsfgsdfg\\sdfg"];
$string is sd\"fg","dgf","dsfgsdfg\\sdfg

url is "sd"fg"
url is "dgf"
url is "dsfgsdfg\sdfg"

根据您的输入,输出为:

$string is t.mysite\/images\/test\/m\/[mike]_Original_Work_-_summer\/thumbs\/001.thumb.jpg","\/\/t.mysite\/images\/manga\/m\/[mike]_Original_Work_-_summer\/thumbs\/002.thumb.jpg","\/\/t.mysite\/images\/manga\/m\/[mike]_Original_Work_-_summer\/thumbs\/003.thumb.jpg"];
$string is t.mysite\/images\/test\/m\/[mike]_Original_Work_-_summer\/thumbs\/001.thumb.jpg","\/\/t.mysite\/images\/manga\/m\/[mike]_Original_Work_-_summer\/thumbs\/002.thumb.jpg","\/\/t.mysite\/images\/manga\/m\/[mike]_Original_Work_-_summer\/thumbs\/003.thumb.jpg

url is "t.mysite/images/test/m/[mike]_Original_Work_-_summer/thumbs/001.thumb.jpg"
url is "//t.mysite/images/manga/m/[mike]_Original_Work_-_summer/thumbs/002.thumb.jpg"
url is "//t.mysite/images/manga/m/[mike]_Original_Work_-_summer/thumbs/003.thumb.jpg"

你想要的输出是不同的。您真的要删除 .thumb 部分吗?

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2022-11-24
    • 1970-01-01
    • 2016-03-02
    • 2021-09-29
    相关资源
    最近更新 更多