在Bash脚本中使用变量输入而不是文件

时间:2019-12-07 03:30:27

标签: bash unix

我想使用“ ed”在变量中换行分隔的文本中上下移动行。例如,将第二行向下移动:。

从变量输入:

one
two
three
four

输出到变量:

one
three
two
four

下面的单行代码可以很好地处理文件,但我想为它提供一个变量。

printf '%s\\n' '2,2m3' 'wq' | /bin/ed -s '/inputFile'

我尝试过各种变体

printf '%s\\n' '2,2m0' 'wq' | /bin/ed -s <<<$inputVariable

这不起作用,而且我的重定向专业知识显然不足以解决这个难题。

我正在运行macOS 10.15.1。

2 个答案:

答案 0 :(得分:2)

ed程序仅处理来自STDIN的命令(并且不支持通过命令行传递命令)。为此,您需要将输入内容表示为文件名(不一定是文件)。

以下使用“此处字符串”将变量input转换为文件名(/dev/fd/3),

#! /bin/bash

input=$(ls -l)
out=$(printf '%s\n' '2,2m3' '1,$p' | ed 3<<<"$input" /dev/fd/3)
echo "$out"

或者,显式引用/ dev / fd或特定的文件描述符。

#! /bin/bash

input=$(ls -l)
out=$(ed <(printf '%s', "$input") <<___
2,2m3
1,\$p
___

答案 1 :(得分:1)

您还可以使用Bash的内置索引操作,而不是生成ed:

#!/usr/bin/env bash

inputVariable='one
two
three
four
five
six
'

IFS=$'\n' set -- $inputVariable

swp=3 # swap lines 3 and 4

printf '%s\n' "${@:1:swp-1}" "${@:swp+1:1}" "${@:swp:1}" "${@:swp+2}"

输出:

one
two
four
three
five
six

功能细节:

  • IFS=$'\n' set -- $inputVariable:将$inputVariable的行作为参数传递。

  • printf '%s\n':将参数打印为行。

  • "${@:1:swp-1}":将所有参数行从1 st 索引扩展到交换之前的最后一个索引。

  • "${@:swp+1:1}" "${@:swp:1}":执行实际参数行交换,下一个索引为swp+1,后跟swp索引。

  • "${@:swp+2}":在交换索引swp+2之后扩展所有剩余的参数。