Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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 如何获取文件名中间部分的分隔符?_Bash_Shell - Fatal编程技术网

Bash 如何获取文件名中间部分的分隔符?

Bash 如何获取文件名中间部分的分隔符?,bash,shell,Bash,Shell,我知道获取由分隔符分隔的文件名的第一部分和最后一部分的方法。例如: #!/bin/bash file_name=aaa.bbb.ccc.ddd first_name=${file_name%%.*} last_name=${file_name##*.} echo first name is: $first_name echo last name is: $last_name 输出为: first name is: aaa last name is: ddd 但是,如果我想获得bbb或ccc,

我知道获取由分隔符分隔的文件名的第一部分和最后一部分的方法。例如:

#!/bin/bash
file_name=aaa.bbb.ccc.ddd
first_name=${file_name%%.*}
last_name=${file_name##*.}
echo first name is: $first_name
echo last name is: $last_name
输出为:

first name is: aaa
last name is: ddd
但是,如果我想获得
bbb
ccc
,我该如何获得它呢?非常感谢

$ file_name=aaa.bbb.ccc.ddd
$ echo "$file_name" | awk -F. '{print $2}'
bbb
$ echo "$file_name" | awk -F. '{print $3}'
ccc
或者,要在变量中捕获:

$ middle1=$(echo "$file_name" | awk -F. '{print $2}')
$ middle2=$(echo "$file_name" | awk -F. '{print $3}')
$ echo "middle1=$middle1 and middle2=$middle2"
middle1=bbb and middle2=ccc
工作原理
  • -F.

    这告诉
    awk
    使用句点(
    )作为字段分隔符。因此,在awk术语中,第一个名字是
    $1
    ,第二个是
    $2
    ,等等。在您的示例中,姓氏是
    $4
    ,但通常,姓氏可以作为
    $NF
    访问

  • 打印$2

    这要求awk打印第二个名称或您选择的任何名称

更改:

或者用set,也很简单:

IFS=. set $file_name
echo $1
aaa
echo $2
bbb
echo $3
ccc
echo $4
ddd
echo $first_name
aaa
echo $middle1
bbb
echo $middle2
ccc
echo $last_name
ddd
IFS=. set $file_name
echo $1
aaa
echo $2
bbb
echo $3
ccc
echo $4
ddd