首页 > 解决方案 > sed 使用美元符号进行环境变量和行尾模式匹配

问题描述

sed,我们使用双引号来读取由美元符号表示的环境变量,如果我想同时使用美元符号作为行尾模式该怎么办?

这是我的命令示例(不工作),

cat inputfile | xargs -n4 sh -c 'sed -ne "$1,$2p" bigfile|sed -e "$s/$/\n+--$3-----+/" > $0.outputfile' 

我通过管道传输输入文件的内容(包含输出文件名、目标行号(开始和结束)以及要添加到每个文件的一些标签),xargs将大文件分成更小的文件。输入文件示例:

dataA
59
88
sometagA
dataB
91
236
sometagB
....

在第二个sed命令中:sed -e "$s/$/\n+--$3-----+/",$3是来自 的环境变量xargs,我想分别使用其他 $s 和 $ 来定位文件结尾和行尾模式,因为我打算在每个输出文件中插入一些标签。我不能同时使用单引号和双引号,因为外部xargs已经使用了单引号。

标签: bashsedenvironment-variables

解决方案


使用反斜杠从 shell 中转义美元符号。

xargs -n4 sh -c 'sed -ne "$1,$2p" bigfile |
    sed -e "\$s/\$/\n+--$3-----+/" > "$0".outputfile' <inputfile

你只传递了四个参数,它们从零开始编号,所以我猜你的意思是$3,不是$4

还要注意如何避免无用的cat.

这两个sed脚本可能会合并成类似的东西

sed -n "$1,$2!d;$2{;s/\$/+--$3-----+/p;q;}p"

推荐阅读