我需要做的(在 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
(在知道它有效之前不要使用!)
有关的: