Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.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
使用sed修改bash变量_Bash_Sed - Fatal编程技术网

使用sed修改bash变量

使用sed修改bash变量,bash,sed,Bash,Sed,为什么followBash脚本不起作用?我想把它输出 有两行是这样的: XXXXXXX YYYYYYY s/./X/g s/./Y/g 如果我将sed行更改为使用文件名而不是变量,则它可以工作,但我希望使用变量 #!/bin/bash input=$(echo -e '=======\n-------\n') for sym in = -; do if [ "$sym" == '-' ]; then replace=Y else replace=X fi

为什么followBash脚本不起作用?我想把它输出 有两行是这样的:

XXXXXXX
YYYYYYY
s/./X/g
s/./Y/g
如果我将sed行更改为使用文件名而不是变量,则它可以工作,但我希望使用变量

#!/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"
#/bin/bash
输入=$(echo-e'==========\n------\n')
对于sym in=-;做
如果[“$sym”=='-'];然后
替换=Y
其他的
替换=X
fi
printf“%s\n”s//$replace/g

done | sed-f-主要问题是,您给sed两个源来读取标准输入:通过管道输入的for循环和通过here字符串输入的变量。事实证明,here字符串具有优先权,sed抱怨命令后面有额外字符(
=
是一个命令)

您可以使用流程替换,而不是here字符串:

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' '=======' '-------')
这是因为最终生成的sed脚本如下所示:

XXXXXXX
YYYYYYY
s/./X/g
s/./Y/g

无论您先做什么,最后一个命令都会用
Y

替换所有内容。如果您使用的文件包含
input
所包含的内容,并使用该文件而不是here字符串,那么您是否真的得到了所需的输出,而不是全部
Y
?您正在同时对stdin进行管道和重定向。您只能执行一项操作,因为它们都会覆盖标准输入。为什么不使用tr(或sed、awk等)-
echo“$input”| tr'=-“XY”