sed를 사용하여 n번째 나타나는 단어 바꾸기

sed를 사용하여 n번째 나타나는 단어 바꾸기

저는 sed를 배우고 있으므로 이 경우 "line"이라는 단어의 두 번째 항목을 바꾸려고 합니다. 그래서 다음 명령을 내립니다.

(zet:pc:~/text) sed 's/line/LINUX/2' mytextfile
this is line 1
this is line 2
this is line 3
this is line 4
this is line 5

그러나 출력에서 ​​"sed"가 두 번째로 나타나는 world "line"을 대체하지 않는다는 것을 알 수 있습니다. 그렇다면 제가 여기서 실수를 하고 있는 걸까요?

답변1

s/../../2각 줄에서 두 번째 항목을 바꿉니다.

파일을 다음과 같이 읽으면하나철사:

GNU 사용 sed:

sed -z 's/line/LINUX/2' mytextfile

정상적인 상황에서 sed:

tr '\n' '\0' < mytextfile  |  sed 's/line/LINUX/2'  |  tr '\0' '\n'

이렇게 하면 잘못된 결과가 생성됩니다.높은너무 가능하지 않음이 파일의 경우이미널 바이트를 포함합니다.


두 번째 줄의 첫 번째 항목을 바꾸려면 다른 답변을 참조하십시오 :-)

답변2

파일에서 두 번째 항목은 두 번째 줄에 있으므로 필요한 것은 다음과 같습니다.

sed '2s/line/LINUX/' mytextfile

파일을 그 자리에서 편집하려면:

sed -i '2s/line/LINUX/' mytextfile

두 번째 줄 에서 2s변경이 이루어집니다. line명령은 문자열이 하나 이상의 줄에 여러 번 나타나는 경우 에만 작동합니다.

답변3

라인 구문 분석의 경우 "s" 명령 앞에 라인 번호를 언급해야 합니다.

$ echo "this is line 1
this is line 2
this is line 3
this is line 4
this is line 5" | sed -e '2s/line/LINUX/'
this is line 1
this is LINUX 2
this is line 3
this is line 4
this is line 5

따라서 귀하를 위한 명령은 다음과 같습니다.

sed -e '2s/line/LINUX/' mytextfile

예, 줄 번호에 관계없이 전체 파일에서 두 번째 항목만 바꾸려는 경우 pLumo의 대답은 정확합니다.

sed -z 's/line/LINUX/2' mytextfile

관련 정보