如何在bash内联字符串shell替换中表示换行符?

时间:2015-04-20 20:01:20

标签: bash

我可以修改如下字符串:

mod=${orig//[xyz]/_}

它将用_

替换[xyz]的所有出现

但如果我有一个字符串如eth0 eth1 eth2,我该如何替换' '换行的空格\ n。以下不起作用。

orig="eth0 eth1 eth2"
mod=${orig// /\n}

这就是我计划使用它的方式:

VRRP_INTERFACE="${VRRP_INTERFACE:-ib0}"
VRRP_ADDITIONAL_INTERFACES="${VRRP_ADDITIONAL_INTERFACES// /\\n}"

cat << EOF > /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
  interface ${VRRP_INTERFACE}
  state BACKUP
  virtual_router_id ${VRRP_ROUTER_ID}
  priority ${VRRP_PRIORITY}
  advert_int 1
  # Monitor these as well
  track_interface {
    $VRRP_ADDITIONAL_INTERFACES
  }
  virtual_ipaddress {
    ${VRRP_VIP} dev ${VRRP_INTERFACE} label ${VRRP_INTERFACE}:1
  }
EOF

我注意到,如果我使用 echo -e $ VRRP_ADDITIONAL_INTERFACES当字符串包含&#34; \ n&#34;在字符串中。即用\ n替换\ n而不是\ n。

但是在使用cat << EOF > filename格式的情况下,它不起作用。

3 个答案:

答案 0 :(得分:4)

使用$'\n'

$ orig="eth0 eth1 eth2"
$ mod=${orig// /$'\n'}
$ echo "$mod"
eth0
eth1
eth2

此方法将实际换行符放入字符串mod

使用cat << EOF

考虑使用相同替换的shell脚本:

orig="eth0 eth1 eth2"
mod=${orig// /$'\n'}
cat << EOF > test.txt
track_interface {
$mod
}
EOF
cat test.txt

运行时,这是输出:

$ bash script.sh
track_interface {
eth0
eth1
eth2
}

请注意,此方法需要bash。因此,在类似debian的系统上(shdash),以下工作:

$ sh script.sh
matt.sh: 2: script.sh: Bad substitution

答案 1 :(得分:0)

@ John1024解决方案,效果很好

orig="eth0 eth1 eth2"
mod=${orig// /$'\n'}

cat << EOF > test.txt
 track_interface {
  $mod
 }
EOF

答案 2 :(得分:0)

我想出了一个方法。它并不漂亮,但却有效。

将cat分配给变量FILE 然后echo -e "$FILE" > filename

VRRP_INTERFACE="${VRRP_INTERFACE:-ib0}"
VRRP_ADDITIONAL_INTERFACES="${VRRP_ADDITIONAL_INTERFACES// /'\n'}"

FILE=$(cat << EOF
vrrp_instance VI_1 {
  interface ${VRRP_INTERFACE}
  state BACKUP
  virtual_router_id ${VRRP_ROUTER_ID}
  priority ${VRRP_PRIORITY}
  advert_int 1

  # Monitor these as well
  track_interface {
    $VRRP_ADDITIONAL_INTERFACES
  }
  virtual_ipaddress {
    ${VRRP_VIP} dev ${VRRP_INTERFACE} label ${VRRP_INTERFACE}:1
  }
EOF
)

echo -e "$FILE" > /etc/keepalived/keepalived.conf