Sed - 如何根据接下来的2个字符替换第一个字符

时间:2016-09-26 21:47:26

标签: bash sed

我想删除";"如果没有跟随"数字" +" ="标志。 e.g。

echo "32=rtys;54tyu;45_fd;62=xyz;fdg"
output should be "32=rtys54tyu45_fd;62=xyzfdg"

我在下面试过,但它只适用于字母。

sed 's/;\($\|[^[:digit:]=]\)/\1/g' 

但它只适用于; +字母而非其他字母。

3 个答案:

答案 0 :(得分:2)

使用sed

$ 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

这分三步进行:

  1. s/;/\n/g用换行符替换所有分号。因为,默认情况下,sed一次输入一行,模式空间永远不会有新行开始。因此不会混淆。

  2. s/\n[0-9]+=/;&/g在任何换行符后面加一个分号,后跟一个数字,后面跟一个等号。

  3. s/\n//g删除所有换行符。

  4. 以上是在GNU sed上测试的。对于BSD / OSX,可能需要进行一些更改。以下可能有效:

    sed -E $'s/;/\n/g; s/\n[0-9]+=/;&/g; s/\n//g' <<<"$s"
    

    使用awk

    $ 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+=)后面没有一个或多个数字;