파일에서 마지막 n 줄을 어떻게 편집합니까? 줄에서 쉼표를 세미콜론으로 바꾸는 것이 목표입니다. 그러나

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

답변

tacsed 를 사용하여 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


답변

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

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

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

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


답변