Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 我需要为每个八位字节填充IP地址_Bash_String - Fatal编程技术网

Bash 我需要为每个八位字节填充IP地址

Bash 我需要为每个八位字节填充IP地址,bash,string,Bash,String,从一个未指定长度的字符串开始,我需要将其精确设置为43个字符(前面用零填充)。它将包含IP地址和端口号。比如: ### BEFORE # Unfortunately includes ':' colon 66.35.205.123.80-137.30.123.78.52172: ### AFTER # Colon removed. # Digits padded to three (3) and five (5) # characters (for IP address and port nu

从一个未指定长度的字符串开始,我需要将其精确设置为43个字符(前面用零填充)。它将包含IP地址和端口号。比如:

### BEFORE
# Unfortunately includes ':' colon
66.35.205.123.80-137.30.123.78.52172:
### AFTER
# Colon removed.
# Digits padded to three (3) and five (5) 
# characters (for IP address and port numbers, respectively)
066.035.005.123.00080-137.030.123.078.52172  
这与生产的产品类似

用Bash编程。如果需要,我可以提供脚本副本。

如果可能的话,为了提高速度,最好使用内置的bash。
printf
适合这种类型的东西吗?

是的,听起来很适合
printf
。您可能可以使用
cut
将传入地址拆分为字段,然后将这些字段反馈到
printf
中进行格式化

这是一个快速的草图,当然可以对其进行改进,以获得所需的精确输出格式:

#!/usr/bin/env bash

function format_address()
{
    printf "%03d.%03d.%03d.%03d.%05d" $(echo $1 | cut -d'.' --output-delimiter=' ' -f1-5)
}

for a in $(echo $1 | tr -d ':' | cut -d '-' --output-delimiter=' ' -f1,2)
do
    format_address $a
done

是的,听起来很适合
printf
。您可能可以使用
cut
将传入地址拆分为字段,然后将这些字段反馈到
printf
中进行格式化

这是一个快速的草图,当然可以对其进行改进,以获得所需的精确输出格式:

#!/usr/bin/env bash

function format_address()
{
    printf "%03d.%03d.%03d.%03d.%05d" $(echo $1 | cut -d'.' --output-delimiter=' ' -f1-5)
}

for a in $(echo $1 | tr -d ':' | cut -d '-' --output-delimiter=' ' -f1,2)
do
    format_address $a
done

这使用
IFS
将地址信息拆分为一个数组。然后
printf
将格式化后的结果保存回原始变量以供进一步处理。纯Bash-不使用外部可执行文件

addr='66.35.205.123.80-137.30.123.78.52172:'
saveIFS=$IFS
IFS='.-:'
arr=($addr)
IFS=$saveIFS
printf -v addr "%03d.%03d.%03d.%03d.%05d-%03d.%03d.%03d.%03d.%05d" ${arr[@]}
do_something "$addr"
编辑:

在不使用数组的情况下:

addr='66.35.205.123.80-137.30.123.78.52172:'
saveIFS=$IFS
IFS='.-:'
printf -v addr "%03d.%03d.%03d.%03d.%05d-%03d.%03d.%03d.%03d.%05d" $addr
IFS=$saveIFS
do_something "$addr"

这使用
IFS
将地址信息拆分为一个数组。然后
printf
将格式化后的结果保存回原始变量以供进一步处理。纯Bash-不使用外部可执行文件

addr='66.35.205.123.80-137.30.123.78.52172:'
saveIFS=$IFS
IFS='.-:'
arr=($addr)
IFS=$saveIFS
printf -v addr "%03d.%03d.%03d.%03d.%05d-%03d.%03d.%03d.%03d.%05d" ${arr[@]}
do_something "$addr"
编辑:

在不使用数组的情况下:

addr='66.35.205.123.80-137.30.123.78.52172:'
saveIFS=$IFS
IFS='.-:'
printf -v addr "%03d.%03d.%03d.%03d.%05d-%03d.%03d.%03d.%03d.%05d" $addr
IFS=$saveIFS
do_something "$addr"

美好的但是“-”必须出现在两个集合之间:066.035.005.123.00080-137.030.123.078.52172Nice。但是“-”必须出现在两个集合之间:066.035.005.123.00080-137.030.123.078.52172$IFS-您已经不止一次地帮助过我了DW:)接受了不使用外部可执行文件的答案。这很有效。但我想知道为什么使用数组?使用空格分隔的值的单个变量是否也可以执行此任务?它会在某种程度上与printf冲突吗?@Felipe:你可以不用数组。我将发布一篇编辑文章来说明这一点。$IFS-您已经不止一次地帮助过我了DW:)因为没有使用外部可执行文件而接受了答案。这很有效。但我想知道为什么使用数组?使用空格分隔的值的单个变量是否也可以执行此任务?它会在某种程度上与printf冲突吗?@Felipe:你可以不用数组。我将发布一个编辑,显示这一点。