sed 명령을 사용하여 총 99줄이 있는 파일에서 세 번째 줄을 모두 삭제하고 싶습니다. 처음 세 행을 유지하고 마지막 세 행을 삭제하는 식으로 진행됩니다.
내 시작 스크립트는 다음과 같습니다.
for i in `seq 1 6 99`; do
sed '$i,${i+2}!d' test.txt > o$i.txt
done
cat o*.txt > O.txt
rm o*.txt
개인적으로 좋은 직업을 갖고 있고 좋아해요
sed '1,3!d' test.txt > o1.txt
sed '7,9!d' test.txt > o7.txt
...
하지만 sed에서는 작동하지 않습니다. 내가 뭘 잘못하고 있는지 알려주실 수 있나요? 감사해요
답변1
에서 제안한대로논평, sed 호출에서 변수를 올바르게 인용해야 합니다.
for i in $(seq 1 6 99); do
sed "$i"','"$((i+2))"'!d' test.txt > "o$i.txt"
done
변수는 작은따옴표로 확장되지 않으며 문자 그대로 사용됩니다( $i
= 마지막 줄 앞에 삽입됨). 큰따옴표(이 예에서는 따옴표가 작동하지 않음)를 사용하여 확장하려면 $((…))
산술 평가를 수행하고 그 결과를 출력해야 합니다. 스크립트의 나머지 부분은 작은따옴표로 묶여 있습니다.
$(…)
또한 더 이상 사용되지 않는 역따옴표 대신 명령 대체를 위해 업데이트된 구문을 사용해야 합니다 `…`
. 그러면 인용이 더 쉬워집니다. 여기 하나 있어요좋은 예.
sed
하지만 GNU를 사용할 수 있습니다첫걸음 ~ 첫걸음루프 대신 연산자:
sed '4~6{N;N;d}' file
예:
$ seq 20 | sed '4~6{N;N;d}'
1
2
3
7
8
9
13
14
15
19
20
설명하다:
sed '4~6d'
4행이 삭제되고 6행이 10, 16, 22...
{N;N;d}
나머지 두 행(4, 5, 6, 10, 11, 12)을 삭제합니다 .