我有一个文件,其中有两列。
cat test.txt
100 2007
FFF 1993
7E7 1994
4BB 1995
我需要将每一行输入到脚本中,并将两列分配为单独的变量,以便我可以通过不同的循环运行它们,然后移至下一行。
我有一长串文件,需要对每一对执行查找和替换功能。我正在将集合转换为我已经绘制好的年份。
我的脚本看起来像这样。
SET=$1
YEAR=$2
for i in `ls` ; do
sed -i "" 's/"$1"/"$2"/g' $i;
done
我不知道如何让 test.txt 使用新行循环脚本。
答案1
您可以read
根据空格(看起来像您的文件使用的)来分割行。像这样的东西:
while read set year; do
DoStuffWith "$set" "$year"
done <test.txt
其他注意事项:
请注意,我在上面的示例中使用了小写变量名称。有一堆具有特殊含义的全大写名称,避免与它们发生冲突的最安全方法是坚持使用小写或混合大小写的变量(除非您想的特殊意义)。
不要迭代的输出
ls
,只需使用for i in *; do
.并用双引号引用以$i
避免在某些情况下出现奇怪的解析。除非您不需要这样做,
sed
如果您使用sed -i "" 'whatever' *
.在
sed
命令中,您似乎试图在单引号字符串中使用变量替换和双引号,但这不起作用。如果您不希望双引号实际上成为搜索/替换字符串的一部分,请改用:sed -i "" "s/$set/$year/g" *
如果您确实希望在搜索和替换字符串中使用文字双引号,请将它们转义:
sed -i "" "s/\"$set\"/\"$year\"/g" *
看起来你打算循环遍历文件,并且对每一行循环遍历每个文件以替换该字符串。为什么不进行一次运行呢?全部替代品?也就是说,而不是
sed
使用命令运行s/100/2007/g
,然后再次使用命令s/FFF/1993/g
,然后再次...为什么不使用命令运行一次s/100/2007/g; s/FFF/1993/g; s/7E7/1994/g; ...
?您需要
sed
在循环中构建命令,如下所示:sedCommand="" while read set year; do sedCommand+="s/$set/$year/g; " done <test.txt sed -i "" "$sedCommand" *
最后,像这样的全球替代品让我担心。您确定“100”不会出现在除了那些应替换为“2007”的实例之外的任何文件中吗?这包括 test.txt 文件吗?
您有所有这些文件的备份吗?在你不想失去任何东西之前,你真的应该这样做。