대체 라인에 sed 사용

대체 라인에 sed 사용

다음과 같은 패턴의 파일이 있습니다.

12345.ABC9998
12345555.abc:ffr.abc-MKDHJKSJJDOKSOKSDCKJODCKJ

12345.ABC9998
12345555.abc:ffr.abc-MKDHJKSJJDOKSOKSDCKJODCKJ

대시 앞의 모든 항목을 제거하고 두 번째 줄의 각 줄에 대시 자체를 포함하고 싶습니다.

예상 출력:

12345.ABC9998
MKDHJKSJJDOKSOKSDCKJODCKJ

12345.ABC9998
MKDHJKSJJDOKSOKSDCKJODCKJ

나는 sed 's/^[^A-Z]*//' file.txt이것이 가능하다는 것을 알고 있지만 모든 행에 대해 작동합니다. 원하는 행(다른 모든 행)에서만 작동하도록 편집하려면 어떻게 해야 합니까?

답변1

대시가 포함된 줄에서만 작업하려는 경우(귀하의 예에서는 그런 것 같습니다) 다음이 작동합니다.

sed 's/^.*-//' file.txt

대시를 포함하여 각 줄의 시작 부분에 있는 모든 내용이 제거됩니다. 그 외에도 대시가 없는 줄에서는 정규식이 일치하지 않으므로 대체를 수행하지 않고 줄을 그대로 둡니다.


원하는 것이 다른 모든 줄에만 변환을 적용하는 것이라면 명령 sed( n"다음"을 의미)을 사용하여 한 줄을 건너뛰지만 여전히 출력으로 보낼 수 있습니다.

이것은 실제로 짝수 행에서 작업하기를 원하고(귀하의 예에서는 블록 사이에 빈 행이 있으며 복사하여 붙여넣기 아티팩트라고 가정합니다) 질문 제목 "대체 행"이 실제로 원하는 것이라고 가정합니다. .)

이 명령은 짝수 줄에만 정규식을 적용합니다.

sed 'n;s/^[^A-Z]*//' file.txt

답변2

이렇게 하면 두 번째 줄마다 대시까지 모든 내용이 제거됩니다 .

sed '0~2s/.*-//' infile

이 줄 다음 줄에서 두 번째 줄을 제거하려면 12345.ABC9998다음을 수행합니다.

sed '/^12345.ABC9998$/{n; s/.*-//}' infile

문자열이 포함된 줄 뒤의 두 번째 줄을 삭제하려는 경우 12345.ABC9998다음과 같이 할 수 있습니다.

sed '/12345.ABC9998/{n; s/.*-//}' infile

답변3

또는 다른 줄마다 대문자 앞에 있는 모든 항목을 제거하도록 명령할 수 있습니다. 이렇게 하면 대시 이전의 모든 항목과 대시 자체를 적절하게 제거할 수 있습니다.

sed -i '0~2s/[^A-Z]*//' file

관련 정보