![从文件中读取并使用循环返回新行](https://linux22.com/image/142046/%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%E8%AF%BB%E5%8F%96%E5%B9%B6%E4%BD%BF%E7%94%A8%E5%BE%AA%E7%8E%AF%E8%BF%94%E5%9B%9E%E6%96%B0%E8%A1%8C.png)
我有一个像这样的文件
foo.txt
xxx B=C D: A
yyy F=H D:A
zzz K=L D: A
fff M=H D:/llll
kkk S=D D: /kkkkk
这就是我试图得到的;
xxx B=C; D: A ;pass
yyy F=H; D:A ;pass
zzz K=L; D: A ;pass
fff M=H; D:/llll ;try
kkk S=D; D: /kkkkk/bb ;try
以“D:”开头的行的第二部分,如果以“/”开头,则应写“try”,否则必须为其中的每一行写“pass”行尾。
我可以像这样读取文件,但有空格,这是另一个问题
此外,“D:”之后始终以“A”或“/”开头。
我尝试了 while 循环,但没有成功。
cat /tmp/foo.txt | cut -d ":" -f,2
输出
A (one empty space)
A (none)
A (three empty space)
/llll (none)
/kkkkk/bb (two empty space)
这是我尝试过的一个例子
while read -r line;
do
if [[ $line ]]; then
echo $line "try"
else
echo $line "pass"
fi
done < foo.txt
答案1
您可以使用awk
,这使得很容易实现你想要的:
awk '!/D: *\//{print $0 " ;pass"; next} {print $0 " ;try"}' foo.txt
输出:
xxx B=C D: A ;pass
yyy F=H D:A ;pass
zzz K=L D: A ;pass
fff M=H D:/llll ;try
kkk S=D D: /kkkkk ;try
这基本上匹配每一行不包含 D:
和/
附加;pass
到它,然后跳到下一行。否则它会附加;try
到它。
答案2
您不能在同一个文件中写入,我建议创建一个新文件,然后重命名它。
tmpFile="/tmp/foo2.txt.tmp"
cat /tmp/foo.txt | while read line; do
isSlash=$(echo $line | cut -d ":" -f2 | awk '{print $1}' | grep -c ^"/")
if (( $isSlash )); then
echo "$line ;try" >> $tmpFile
else
echo "$line ;pass" >> $tmpFile
fi
done
mv $tmpFile /tmp/foo.txt
答案3
sed
好的?
$ sed '/D: *A/ s/$/\t;pass/; /D: *\// s/$/\t;try/' file
xxx B=C D: A ;pass
yyy F=H D:A ;pass
zzz K=L D: A ;pass
fff M=H D:/llll ;try
kkk S=D D: /kkkkk ;try