파일에서 마지막 n 줄을 어떻게 편집합니까?


10

파일에서 마지막 n 줄을 편집 할 수있는 명령이 있습니까? 내부에 여러 줄이있는 여러 파일이 있습니다. 그러나 각 파일의 마지막 n 줄을 수정하고 싶습니다. 마지막 n 줄에서 쉼표를 세미콜론으로 바꾸는 것이 목표입니다. 그러나 마지막 n 줄에서만.

줄을 삭제하고 싶지 않고 각 파일의 마지막 n 줄에서 모든 쉼표를 세미콜론으로 바꾸고 싶습니다.

sed 명령을 사용하여 마지막 명령을이 명령으로 바꿀 수 있습니다. 여기에 설명 된대로 : 파일의 마지막 줄에서 텍스트를 제거하려면 어떻게해야합니까?

그러나 이것은 마지막 n 줄만 아니라 마지막 줄만 수정할 수있게합니다.


1
간단하게 사용하는 sed '24,$s/,/:/g' filename 곳을 24시작 line`입니다
발렌틴 Bajrami

답변:


13

와 마지막 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 = 쉼표를 세미콜론으로 바꾸십시오.

로 교체 할 수 wc -l < input있습니다 wc -l input. : 몇 나노초 더 빨라야합니다 :)
gardenhead

1
것을 제외하고 wc -l input출력을 아니라 파일명; 우리는 라인 카운트 만 원합니다
Jeff Schaller

ed의 첫 번째 조언은 훌륭하고 간단합니다.
sku2003

나는 실제로 완전히 다른 측면에서 도움을 얻었습니다. 그 결과이 이상한 코드 조각이 만들어졌지만, 그 방법은 길지만 이상합니다. 이것이 솔루션을 함께 모을 때 끝날 수있는 이상한 일이라고 생각합니다. 어쨌든 당신은 예뻐 짧고 적은 내 자신보다 복잡하다 : 코드는 여기에 또한 일 :
sku2003

고양이 input.file | sed 's /, /, \ n / g'| sed -n '1! G; h; $ p'| awk -vn = 2 'NR <= n {gsub ( ",", ";", $ 0)} {print}'| sed -n '1! G; h; $ p'| sed '/ ^ \ s * $ / d'> output.file
sku2003

6

tacsed 를 사용하여 file.txt의 마지막 50 줄에서 모든 쉼표를 세미콜론으로 바꾸는 솔루션 :

tac file.txt | sed '1,50s/,/;/g' | tac

5

GNU head와 Bourne과 같은 쉘을 사용하는 경우 :

n=20
{ head -n -"$n"; tr , ';'; } < file 1<> file

파일 자체를 덮어 씁니다. 즉 바이트로 바이트 음역 여기 괜찮아요하지만 수정은 파일의 크기를 변경을 의미하는 경우 반드시 (이 경우, 당신은 대체 싶어 것 1<> file으로 > other-file && mv other-file file예를 들면).


1
에 대한 문서는 다음과 같습니다1<> . 또한, sponge에서 moreutils 당신이 당신의 입력을 덮어 쓸 파이프 라인을위한 좋은 도구입니다.
Miles

1

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

0

tailsed를 사용 하고 배관 하십시오 :

tail -n 20 file | sed 's/,/;/g'

이것은 마지막 20 줄의 파일에서 작동합니다. cange를 파일 사용으로 직접 보내려면 다음을 사용하십시오.

tail -n 20 file | sed -i 's/,/;/g'

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.