拆分线创建两个变量

时间:2018-04-11 14:46:37

标签: bash awk sed trim

有没有办法在最后_分割这一行来创建两个变量?

Linux中的文件夹格式为Project_Data1_xxxProject_Data1_Sub1_xxx。我想创建两个变量:

  1. 前两个或三个八位字节
  2. 在最后_之后发生的事情。
  3. 我花了很多时间在这上面并道歉,因为我是Linux新手,我还没有理解windows和linux之间的所有差异。

    问题:我是否将其分为两个语句来获取正面和背面?

    我正在将ls -1文件夹转换为变量。所以我做了

    #!/bin/bash
    srcIn=/scripts/server1
    dstIn=/scripts/server2
    data=test
    
    sourcein=$(ls $srcIn/ | grep $data)
    destinationin=$(ls $dstIn/ | grep $data)
    
    然后我得到:

    echo $destinationin 
    test_data1_xxx test_data2_xxx test_data3_xxx
    
    echo $sourcein 
    test_data1_ccc test_data2_ccc test_data3_ccc
    

    最后。我需要创建一个复制行:

    cp /test_data1_ccc/* /test_data1_xxx
    cp /test_data2_ccc/* /test_data2_xxx
    

    等等......可能有2或3个下划线,但格式始终相同。

    字符串xxxccc可以是abc123ccc567,并且不一定具有相同数量的字符。唯一不改变的是两个位置的唯一差异是在最后_之后 - 但它们总是不同的。

1 个答案:

答案 0 :(得分:3)

我会分两步完成。假设字符串在变量中:

name=Project_Data1_xxx
$ echo ${name%_*}
Project_Data1
$ echo ${name##*_}
xxx
  • ${var%foo}从最后删除foo最短的内容
  • ${var##foo}从头开始删除foo发生的最长时间

这些parameter expansions可以与通配符*结合使用,以删除任何内容,而不是字符串文字。

在你的脚本环境中,我会建议这样的事情:

for input_dir in /scripts/server1/*data*/; do
    base=${input_dir%_*}                 # trim the last part
    base=${base##*/}                     # trim the leading part
    dest=( /scripts/server2/"$base"*/ )  # find the destination dir
    if [[ ${#dest[@]} -eq 1 ]]; then
        cp "$input_dir"* "${dest[0]}"
    else
        echo "${#dest[@]} destination paths found, expected 1"
    fi
done