替换为文本文件特定行中的行号

替换为文本文件特定行中的行号

我需要做的(在 Bash 中)是将文本文件中第二行的特定字符替换为该文件中的行数。因此,这完成了计算行数的工作:

cat test.csv | wc -l

以下命令的作用是将要修改的;0;文件中遇到的数字更改为我从上述命令中获得的数字(在本例中33

sed -i '2s/;0;/;33;/' test.csv

但现在我尝试加入上面两个命令,以便它们作为单个命令工作(我的应用程序中需要它)。我已经尝试了如下所示的多种方法,但没有成功。

sed '2s/;0;/`cat test.csv | wc -l`/' test.csv
cat test.csv | wc -l | sed '2s/;0;//' test.csv
sed '2s/;0;/`${cat test.csv | wc -l}`/' test.csv
sed -e '2s/;0;/echo `${cat test.csv | wc -l}`/;e' test.csv
sed -e '2s/;0;/${echo `cat test.csv | wc -l`}/' test.csv
$rn=`cat test.csv | wc -l`; sed '2s/;0;/${rn}/' test.csv

有人能帮我解决这个问题吗?

答案1

在所有命令中,您都在sed表达式两侧使用单引号。 shell 不会在单引号内进行扩展。

相反(暂时打破单引号表达式以进行双引号命令替换),

sed '2s/;0;/;'"$( wc -l <test.csv )"';/' test.csv

或(对整个表达式使用双引号),

sed "2s/;0;/;$( wc -l <test.csv );/" test.csv

或(使用变量,然后如上所述使用双引号),

lines=$( wc -l <test.csv ); sed "2s/;0;/;$lines;/" test.csv

-i(在知道它有效之前不要使用!)

有关的:

相关内容