简体   繁体   中英

Modify bash variable with sed

Why doesn't the follow bash script work? I would like it to output two lines like this:

XXXXXXX
YYYYYYY

It works if I change the sed line to use a filename instead of the variable, but I want to use the variable.

#!/bin/bash
input=$(echo -e '=======\n-------\n')

for sym in = -; do
  if [ "$sym" == '-' ]; then
    replace=Y
  else
    replace=X
  fi

  printf "%s\n" "s/./$replace/g"
done | sed -f- <<<"$input"

The main problem is that you're giving sed two sources to read standard input from: the for loop that is fed through the pipe, and the variable coming through the here-string. As it turns out, the here-string gets precedence and sed complains that there are extra characters after a command ( = is a command).

Instead of a here-string, you could use process substitution:

for sym in = -; do
    if [ "$sym" == '-' ]; then
        replace=Y
    else
        replace=X
    fi

    printf "%s\n" "s/./$replace/g"
done | sed -f- <(printf '%s\n' '=======' '-------')

You'll notice that the output isn't what you want, though, namely

YYYYYYY
YYYYYYY

This is because the sed script you end up with looks like this:

s/./X/g
s/./Y/g

No matter what you do first, the last command replaces everything with Y .

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM