将 Bash 字符串转换为 Java 字符串
Convert Bash String to JavaString
我想将 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;" >> 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" +
"}";
使用非常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.*$/}"/'
returns
"{\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 \t
s *),请尝试以下操作
(越来越丑了...'):
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" +
"}"
我想将 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;" >> 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" +
"}";
使用非常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.*$/}"/'
returns
"{\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 \t
s *),请尝试以下操作
(越来越丑了...'):
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" +
"}"