我想删除";"如果没有跟随"数字" +" ="标志。 e.g。
echo "32=rtys;54tyu;45_fd;62=xyz;fdg"
output should be "32=rtys54tyu45_fd;62=xyzfdg"
我在下面试过,但它只适用于字母。
sed 's/;\($\|[^[:digit:]=]\)/\1/g'
但它只适用于; +字母而非其他字母。
答案 0 :(得分:2)
$ s="32=rtys;54tyu;45_fd;62=xyz;fdg"
$ sed -E 's/;/\n/g; s/\n[0-9]+=/;&/g; s/\n//g' <<<"$s"
32=rtys54tyu45_fd;62=xyzfdg
这分三步进行:
s/;/\n/g
用换行符替换所有分号。因为,默认情况下,sed一次输入一行,模式空间永远不会有新行开始。因此不会混淆。
s/\n[0-9]+=/;&/g
在任何换行符后面加一个分号,后跟一个数字,后面跟一个等号。
s/\n//g
删除所有换行符。
以上是在GNU sed上测试的。对于BSD / OSX,可能需要进行一些更改。以下可能有效:
sed -E $'s/;/\n/g; s/\n[0-9]+=/;&/g; s/\n//g' <<<"$s"
$ s="32=rtys;54tyu;45_fd;62=xyz;fdg"
$ awk -F\; '{$1=$1; for (i=2;i<=NF;i++) if ($i~/^[0-9]+=/) $i=";"$i} 1' OFS="" <<<"$s"
32=rtys54tyu45_fd;62=xyzfdg
这可以使用;
作为输入的字段分隔符,将空字符串作为输出的字段分隔符。除非我们检查每个字段,否则会删除所有;
:如果字段以数字+ =
开头,我们会在该字段的开头添加分号。
答案 1 :(得分:0)
$ sed -E 's/a/aA/g; s/;([0-9]+=)/aB\1/g; s/;//g; s/aB/;/g; s/aA/a/g' file
32=rtys54tyu45_fd;62=xyzfdg
这是一种常见的惯用方法 - 请参阅https://stackoverflow.com/a/38153467/1745001以获得解释。
答案 2 :(得分:0)
使用否定前瞻很容易做到:
$data = array("username" => "XX", "password" => "XX");
$data_string = json_encode($data);
$ch = curl_init('https://<url excluded>');
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
//Attached the path to .CRT file
curl_setopt($ch, CURLOPT_CAINFO, getcwd() ."/AddTrustExternalCARoot.crt");
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length: '
. strlen($data_string))
);
$result = curl_exec($ch);
echo $result;
$ echo "32=rtys;54tyu;45_fd;62=xyz;fdg" | perl -pe 's/;(?!\d+=)//g'
32=rtys54tyu45_fd;62=xyzfdg
表示;(?!\d+=)
后面没有一个或多个数字;