我想使用“ 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。
答案 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
之后扩展所有剩余的参数。