如何从格式的行文件中连接文本:
line1
line2
...
得到像这样的结果
-o line1:1 -o line2:1 ...
我找到了如何与分隔符连接的解决方案,如下所示:
ds=`cat list.txt`
${ds//$'\n'/','}
但我不知道如何为每个条目添加前缀。
答案1
这取决于您想要对创建的字符串执行什么操作。它看起来像一组命令行选项,因此我假设您希望将它与一些名为 的实用程序一起使用util
。
这是一个解决方案/bin/sh
:
#!/bin/sh
listfile=$1
set --
while IFS= read -r line; do
set -- "$@" -o "$line:1"
done <$listfile
util "$@"
这将从脚本命令行上给出的文件中读取,并且对于从该文件中读取的每一行,它设置要包含的位置参数-o
以及从文件中读取的行的LINE:1
位置。LINE
读取所有行后,它会util
使用构建的命令行参数列表进行调用。通过使用"$@"
(使用双引号),我们确保构造的参数列表中的每个单独项目都被单独引用。
bash
使用数组来bash
保存我们创建的命令行参数:
#!/bin/bash
listfile=$1
while IFS= read -r line; do
args+=( -o "$line:1" )
done <$listfile
util "${args[@]}"
在上面的两个例子中,引用很重要。同样的事实是,我们创建了一个单独项目的数组(每-o
一个LINE:1
都是列表中的项目)。另一种方法是创建一个单串 -o LINE1:1 -o LINE2:1 etc.
,但如果用作 as ,这将被解释为一个参数util "$string"
,并且如果用作 as ,则会经历分词和文件名通配util $string
(如果输入文件中的任何行包含空格、制表符或文件名通配字符,则这将不起作用)。
上面的两个脚本都将用作
$ ./script.sh file
其中script.sh
是可执行脚本文件,file
是要读取的输入文件名。
有关的:
答案2
使用最近的 shell(例如bash
),尝试
mapfile -t TMP <file
TMP=(${TMP[@]/%/:1})
echo ${TMP[@]/#/-o }
-o line1:1 -o line2:1 -o line3:1
答案3
sed 's/\(.*\)/-o \1:1/' file.txt | xargs /path/to/command
替换sed
内容如下:将给定行中的文本替换为“-o the_original_text:1”。然后该xargs
命令获取这些修改后的文本行并将它们连接起来以适合命令行参数
答案4
输入文件:
line1
line2
line3
命令:
perl -lpe '$\=" ";$_="-o $_:1"' input.txt
替代命令:
awk '{ORS=":1 ";print"-o "$0}' input.txt
输出(两个命令相同):
-o line1:1 -o line2:1 -o line3:1