파일의 각 줄 끝에서 특정 문자/문자열을 찾고 마지막 줄을 제외하고 누락된 경우 해당 문자를 추가하려면 어떻게 해야 합니까?

파일의 각 줄 끝에서 특정 문자/문자열을 찾고 마지막 줄을 제외하고 누락된 경우 해당 문자를 추가하려면 어떻게 해야 합니까?

마지막 줄을 제외한 모든 줄 끝에 특정 문자/문자열이 있어야 하는 파일이 있습니다. 각 줄 끝에서 해당 문자/문자열을 검색하고 존재하지 않는 경우 추가하는 쉘 스크립트를 사용하여 이를 어떻게 달성할 수 있습니까?

예를 들어 파일 내용은 다음과 같습니다.

hello1
hello
hell1
hel
end

마지막 줄을 제외한 모든 줄의 끝에 문자 1이 있어야 하며 스크립트의 출력은 다음과 같아야 합니다.

hello1
hello1
hell1
hel1
end

sed나 awk를 사용하여 작성할 수 있을 것 같지만 어떻게 작동할지 잘 모르겠습니다. 미리 감사드립니다.

답변1

한 가지 접근 방식은 다음과 같습니다.

 sed -e '
    s/1$/&/;t
    $!s/$/1/
' file 
sed -e '
  $q; /1$/!s/$/1/
' file

또는:

sed -e '$!{/1$/!s/$/1;}'

또는 빈 줄이 없는 경우:

sed -e '$!s/[^1]$/&1/' 

답변2

또 다른 옵션:

sed '$!s/1\{0,1\}$/1/'

(일부 sed구현은 비표준 \?대안을 지원합니다 \{0,1\}).

sed또는 지원되는 구현 과 동일한 확장 정규식 -E(곧 표준이 될 예정):

sed -E '$!s/1?$/1/'

즉, ( !) 마지막 ( ) 을 제외한 모든 행에서 $선택적 ( \{0,1\}/ ?) 후행 ( ) 을 ( ) 로 $바꾸십시오 .11

답변3

모든 Unix 시스템의 모든 쉘에서 awk를 사용하십시오.

$ awk 'NR>1{print p 1} {sub(/1$/,""); p=$0} END{print p}' file
hello1
hello1
hell1
hel1
end

답변4

(sed에서) 다음을 수행할 수 있습니다.

  1. 1존재하는 모든 곳에서 삭제하십시오 .s/^\(.*\)1$/\1/
  2. 그런 다음 모든 행에 다시 추가합니다. s/.*/&1/
  3. 단, 마지막 행이 아닌 행에 대해서만$!{…}
sed '$!{s/^\(.*\)1$/\1/;s/.*/&1/}' file

또는 아무 것도 캡처하지 않으려면(별표 없음) 다음 중 하나를 수행합니다.

sed '$!{s/1$//;s/$/1/}' file
sed '/1$/b;$!s/$/1/' file

관련 정보