bash:如何使用sed的hold和pattern space来动态交换列表内容?

时间:2017-08-13 12:36:06

标签: bash sed

我有一个带有以下内容的变量$ MYVAR:

Line 5
Line 4
Line 3
Line 2
Line 1

我想要的是改变变量的内容,如下所示:

(1st iteration)             (2nd iteration)             (3rd iteration)

 Line 5                      Line 5                      Line 5
 Line 4                      Line 4                      Line 3
 Line 3                      Line 2                      Line 2
 Line 1                      Line 1                      Line 1
 Line 2                      Line 3                      Line 4

- >将变量的最后一行与从变量末尾开始计数的第n + 1行交换(行数可以改变)。

到目前为止我得到了什么:

counter=1
function change_selection {
  src=$( echo "$MYVAR" | wc -l )
  dest=$((src-$counter))
  MYVAR=$( echo "$MYVAR" | sed -ne "${src}BIGPROBLEM${dest}" )
  $((counter++))
}

你能帮我解决一下“BIGPROBLEM”部分吗? ;)我认为sed hold和pattern space命令可以帮助我,但我无法理解它...

2 个答案:

答案 0 :(得分:0)

Stop using sed to modify a multi-line string, and use an array instead.

array=(
  "Line 5"
  "Line 4"
  "Line 3"
  "Line 2"
  "Line 1"
)

counter=1

change_selection () {
    src=$((${#array[@]} - 1 ))
    dest=$((src - counter))
    tmp="${array[dest]}"
    array[dest]=${array[-1]}
    array[-1]=$tmp
    ((counter++))
}

答案 1 :(得分:0)

使用sed:

sed '2{h;d;};$G;' <<< "$MYVAR"
  • 2{h;d}:第2行存储在保留空间中并从模式空间中删除
  • $G:将持有空间内容添加到变量末尾的模式空间