이런 파일이 있어요
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