【问题标题】:Convert Bash String to JavaString将 Bash 字符串转换为 Java 字符串
【发布时间】:2023-03-17 07:50:01
【问题描述】:

我想将 bash 变量中存在的字符串转换为 Java 支持的字符串样式。

例如: data="{"5": ">10%", "4": "<5%", "3": ">28 months", "2": "20%", "1": 100}"

作为 echo $data

给我这个结果:

    "{\n" + 
    "    \"1\": 21,\n" + 
    "    \"2\": \"40%\",\n" + 
    "    \"3\": \"<24 months\",\n" + 
    "    \"4\": \"<5%\",\n" + 
    "    \"5\": \">10%\"\n" + 
    "}"

但我还需要使用echo "String data = $data;" &gt;&gt; file.txt 将此值传输到一个文件中,其中数据是处理后的值,它会抛出奇怪的结果

String data = "{
" + 
"   \"5\": \">10%\",
" + 
"   \"4\": \"<5%\",
" + 
"   \"3\": \">28 months\",
" + 
"   \"2\": \"20%\",
" + 
"   \"1\": 100
" + 
"}";

但预期是:

String data = "{\n" + 
        "   \"1\": 50,\n" + 
        "   \"2\": \"40%\",\n" + 
        "   \"3\": \">28 months\",\n" + 
        "   \"4\": \"<5%\",\n" + 
        "   \"5\": \">10%\"\n" + 
        "}";

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 尝试 1:echo "${data//$'\n'/"\n\" +"} 尝试 2:echo $data | tr "\"" "\\\"" 尝试 3:echo "${data//\""\\"}" 尝试 4:sed -E 's/"/\\&/4g; s/\\"(,)?$/"\1/ 没有成功
  • 请在问题中包含您尝试过的内容,格式正确。注释不适用于代码。仅使用它们来通知您进行了更改。有关问题的所有重要信息都应包含在问题本身中。
  • 在某些 IDE 中,可以复制文本并将其粘贴到 "|" 之间,然后根据需要扩展文本。或者,您将文本存储在类路径上的 resource 文件中,并打包在应用程序 jar 中。
  • @vfalcao,当 json 值具有更多数组形式的引号时,该解决方案在一种情况下失败,例如:"array": ["val1", "val2"],然后输出类似于:" \"array\": [\"val1\",\n" + "\"val2\"],\n" + 那么有解决方法吗? ?

标签: java string bash sh implicit-conversion


【解决方案1】:

使用极大的adhoc 方法: (调用 perl 两次

data='{"5": ">10%", "4": "<5%", "3": ">28 months", "2": "20%", "1": 100}'
echo $data |\
perl -pe 's/{/{\n/; s/}/\n}/; s/, /,\n/g; s/^"/   "/gm' |\
perl -0pe 's/"/\\"/g; s/\n/\\n" + \n/g; s/^/"/gm; s/\}\\n.*$/}"/'

结果是:

 "{\n" +
 "   \"5\": \">10%\",\n" +
 "   \"4\": \"<5%\",\n" +
 "   \"3\": \">28 months\",\n" +
 "   \"2\": \"20%\",\n" +
 "   \"1\": 100\n" +
 "}"

进一步测试:

test='{"first" : "1st", "second": "2nd", "third" : "3rd" }'

echo $test |\
 perl -pe 's/{/{\n/; s/}/\n}/; s/, /,\n/g; s/^"/   "/gm' |\
 perl -0pe 's/"/\\"/g; s/\n/\\n" + \n/g; s/^/"/gm; s/\}\\n.*$/}"/'

返回

"{\n" +
"   \"first\" : \"1st\",\n" +
"   \"second\": \"2nd\",\n" +
"   \"third\" : \"3rd\" \n" +
"}" 

至于输出这个新字符串,试试:

data='{"5": ">10%", "4": "<5%", "3": ">28 months", "2": "20%", "1": 100}'
newdata=$(echo $data |\
perl -pe 's/{/{\n/; s/}/\n}/; s/, /,\n/g; s/^"/   "/gm' |\
perl -0pe 's/"/\\"/g; s/\n/\\n" + \n/g; s/^/"/gm; s/\}\\n.*$/}"/')

echo "String data = $newdata" >> /tmp/file.txt

至于更新(*用sh代替bash,得到2个\ts *),试试下面的 (越来越丑了……'):

data='{"5": ">10%", "4": "<5%", "3": ">28 months", "2": "20%", "1": 100}'
newdata=$(echo $data |\
perl -pe 's/{/{\n/; s/}/\n}/; s/, /,\n/g; ' |\
perl -0pe 's/"/\\"/g; s/\n/\\n" + \n/g; s/^/"/gm; s/^"/\t\t"/gm; s/^\t\t"/"/; s/\}\\n.*$/}"/')

/bin/echo "String data = $newdata" >> /tmp/file.txt

至于在同一行中获取数组,按照@KNDeeraj 的要求,我们可以使用:

data='{"array": ["v1", "v2"], "5": ">10%", "4": "<5%", "3": ">28 months", "2": "20%", "1": 100}'
newdata=$(echo $data |\
perl -pe 's/{/{\n/; s/}/\n}/; s/, (?!.*?\])/,\n/g; s/^"/   "/gm' |\
perl -0pe 's/"/\\"/g; s/\n/\\n" + \n/g; s/^/"/gm; s/\}\\n.*$/}"/')

echo "String data = $newdata" >> /tmp/file.txt

结果是:

"{\n" +
"   \"array\": [\"v1\", \"v2\"],\n" +
"   \"5\": \">10%\",\n" +
"   \"4\": \"<5%\",\n" +
"   \"3\": \">28 months\",\n" +
"   \"2\": \"20%\",\n" +
"   \"1\": 100\n" +
"}"

【讨论】:

  • 缺少前导引号
  • 他们还是失踪了
  • 糟糕,每行都有前导引号,好的。我认为命令现在很好。
  • @vfalcao 在我的 bash 脚本中,我必须在我的代码中使用两次echo 命令,所以你能指导我如何在我的perl -pe 命令中转义\n twice跨度>
  • @KNDheeraj,请使用此附加信息更新您的问题...也许显示您刚刚引用的那两个 echo
猜你喜欢
  • 2016-04-21
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2011-01-08
  • 2019-10-10
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多