파일에서 마지막 n 줄을 편집 할 수있는 명령이 있습니까? 내부에 여러 줄이있는 여러 파일이 있습니다. 그러나 각 파일의 마지막 n 줄을 수정하고 싶습니다. 마지막 n 줄에서 쉼표를 세미콜론으로 바꾸는 것이 목표입니다. 그러나 마지막 n 줄에서만.
줄을 삭제하고 싶지 않고 각 파일의 마지막 n 줄에서 모든 쉼표를 세미콜론으로 바꾸고 싶습니다.
sed 명령을 사용하여 마지막 명령을이 명령으로 바꿀 수 있습니다. 여기에 설명 된대로 :
파일의 마지막 줄에서 텍스트를 제거하려면 어떻게해야합니까?
그러나 이것은 마지막 n 줄만 아니라 마지막 줄만 수정할 수있게합니다.
답변
와 마지막 n 줄에 세미콜론 쉼표를 교체하려면 ed
:
n=3
ed -s input <<< '$-'$((n-1))$',$s/,/;/g\nwq'
그것을 분리 :
ed -s
= ed를 자동으로 실행 (끝에 쓴 바이트는보고하지 않음)'$-'
= 파일 끝에서 ($
) 빼기 …$((n-1))
= n-1 라인 …- (
$' ... '
= 쉘에서 명령을 보호하기 위해 나머지 명령을 인용하십시오.) ,$s/,/;/g
= … 파일 끝 (,$
) 까지 모든 쉼표를 검색하여 세미콜론으로 바꿉니다.\nwq
= 이전 명령을 종료 한 다음 저장하고 종료
와 마지막 n 줄에 세미콜론 쉼표를 교체하려면 sed
:
n=3
sed -i "$(( $(wc -l < input) - n + 1)),\$s/,/;/g" input
그것을 분리 :
-i
= “in-place”파일 편집$(( ... ))
= 약간의 수학을하십시오 :$( wc -l < input)
= 파일의 줄 수를 얻는다-n + 1
= n-1 행 뒤로 이동,\$
= 파일 끝까지 n-1 행부터 :s/,/;/g
= 쉼표를 세미콜론으로 바꾸십시오.
답변
tac 및 sed 를 사용하여 file.txt의 마지막 50 줄에서 모든 쉼표를 세미콜론으로 바꾸는 솔루션 :
tac file.txt | sed '1,50s/,/;/g' | tac
답변
GNU head
와 Bourne과 같은 쉘을 사용하는 경우 :
n=20
{ head -n -"$n"; tr , ';'; } < file 1<> file
파일 자체를 덮어 씁니다. 즉 바이트로 바이트 음역 여기 괜찮아요하지만 수정은 파일의 크기를 변경을 의미하는 경우 반드시 (이 경우, 당신은 대체 싶어 것 1<> file
으로 > other-file && mv other-file file
예를 들면).
답변
7
다음 순서 의 마지막 줄을 쉘 스크립트와 GNU 구현으로 바꾸고 싶다고 가정 해 봅시다 sed
.
$ seq 20
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
1 단계 : 다음과 같이 시퀀스의 마지막 행 번호를 가져옵니다. 이것 과 저것을 보세요 :
$ lastLine=`seq 20|sed -n '$='`
$ echo $lastLine
20
2 단계 : 편집 할 줄 수 (시퀀스 끝에)를 설정합니다.
$ numberOfLines=7
$ echo $numberOfLines
7
3 단계 : 다음과 같이 이전 변수를 기반으로 시작 줄을 계산합니다. 이것 좀 봐 :
$ startLine=`expr $lastLine - $numberOfLines + 1`
$ echo $startLine
14
4 단계 : 이제 마지막 7 줄 시퀀스를 다음과 같이 다른 것으로 바꿀 수 있습니다. 이것 좀 봐 :
$ seq 20|sed -e "$startLine,+$numberOfLines{s/[12]/WoW/}"
1
2
3
4
5
6
7
8
9
10
11
12
13
WoW4
WoW5
WoW6
WoW7
WoW8
WoW9
WoW0
4 단계는 sed man page 의 섹션 4.4를 사용하고 있습니다 .
'ADDR1,+N'
Matches ADDR1 and the N lines following ADDR1.
4 단계에서도 여기에 언급 된대로 큰 따옴표 를 사용 합니다 .
다음 과 같이 Gohu 의 답변을 사용하면 4 단계가 필요하지 않습니다.
$ seq 20 |tac|sed -e '1,7{s/[12]/WoW/}'|tac
1
2
3
4
5
6
7
8
9
10
11
12
13
WoW4
WoW5
WoW6
WoW7
WoW8
WoW9
WoW0
답변
tail
sed를 사용 하고 배관 하십시오 :
tail -n 20 file | sed 's/,/;/g'
이것은 마지막 20 줄의 파일에서 작동합니다. cange를 파일 사용으로 직접 보내려면 다음을 사용하십시오.
tail -n 20 file | sed -i 's/,/;/g'