파일의 각 줄의 마지막 문자 앞의 문자를 제거하는 방법은 무엇입니까?
sed 's/.$//' myfile1.txt
각 줄의 마지막 문자를 제거하려고 시도했지만 myfile1.txt
각 줄의 마지막 문자에서 두 번째 문자를 제거하는 방법을 잘 모르겠습니다.
답변1
넌 할 수있어:
sed -E 's/.(.)$/\1/' file.txt
백업을 만들지 않고 파일을 편집하려면:
sed -Ei 's/.(.)$/\1/' file.txt
파일을 제자리에서 편집하고 .bak
확장자를 사용하여 원본 파일을 백업하려면 다음을 수행하세요.
sed -Ei.bak 's/.(.)$/\1/' file.txt
POSIX 스타일:
sed 's/.\(.\)$/\1/' file.txt
답변2
이식 가능한 명령에 대한 전체 설명(누군가 물어보니) 이렇게요누구나 이것을 이해할 수 있습니다:
sed 's/.\(.\)$/\1/' file.txt
첫째, "명백한" 내용: 이 줄에는 명령 이름( sed
)과 셸이 명령에 전달한 두 개의 개별 인수가 포함되어 있습니다. 작은따옴표는 쉘에 의해 제거되므로 sed
"seen" 매개변수는 다음과 같습니다:
s/.\(.\)$/\1/
그리고
file.txt
하이픈으로 시작하는 매개변수가 없으므로 sed
옵션으로 해석되지 않습니다.
첫 번째 인수는 실행할 편집 명령으로 해석되고, 다른 모든 인수(이 경우 하나만 file.txt
)는 편집 명령으로 편집할 텍스트를 읽을 파일의 이름(첫 번째 인수)으로 해석됩니다. .
sed
(편집된 텍스트는 파일에 다시 기록되지 않고 "표준 출력", 즉 터미널, 명령줄 창에 다시 기록 됩니다 .)
file.txt
이 명령이 실행될 때 쉘의 "현재 작업 디렉토리" 디렉토리에 있는 파일의 파일 이름이어야 합니다 sed
. (명령이 실행될 때 쉘의 현재 작업 디렉토리에 관계없이 동일한 파일에서 명령이 실행되도록 하려면 "절대 경로"를 읽으십시오.)
이제 편집 명령 자체를 분해하겠습니다.
s/.\(.\)$/\1/
s
편집 명령은 "교체"를 의미하는 문자로 시작됩니다 . "s" 다음의 문자( /
이 경우)부터 동일한 문자의 다음 인스턴스( /
다시)까지는 다음과 같습니다.무늬교체 예정입니다. 즉, 대체될 텍스트가 "어떤 모습"이어야 하는지 지정합니다. sed
이는 대체되어야 하는(교체되어야 하는) 텍스트가 언제 발견되었는지 "알는" 방법을 알려줍니다.
이 예의 패턴은 다음과 같습니다.
.\(.\)$
(실제로 "모드" 대신 올바른 용어는정규식, 원래는 "정규 표현식"의 약어입니다. 여기서는 정규식에 대한 더 넓은 주제를 논의하지 않겠습니다. )
정규식은 .
"모든 단일 문자"를 의미하는 "와일드카드"인 점( )으로 시작합니다. 그것성냥(설명, 기호) 텍스트의 단일 문자입니다.
백슬래시( \
)는 쉘 명령 및 정규 표현식에서 "이스케이프" 문자로 자주 사용됩니다. 일반적으로 이것은 다음 중 하나를 의미합니다.삭제그 뒤에 오는 문자의 특별한 의미 또는다음에 추가다음 문자에는 특별한 의미가 있습니다.
이 경우 대괄호 (및 (
) 는 다음 )
과 같습니다.탈출하다(즉, 앞에 백슬래시가 옴) 순서대로다음에 추가특별한 의미가 있습니다. 정규식에서 이스케이프된 괄호의 특별한 의미는 sed
괄호 사이의 정규식 부분과 일치하는 모든 텍스트가 특별히 "주석 처리"되어다시 환승하다도착하다. 이에 대해서는 나중에 다시 다루겠습니다(이 대괄호 그룹화를 검토할 때).
.
괄호 안의 마침표( )는 다시 단일 문자와 일치합니다.
달러 기호( $
)를 호출합니다.닻,일치한다텍스트 줄의 끝입니다. 이 앵커가 없으면 정규식은 단순히 일치합니다.임의의 두 문자(특히, 이는 이름이 지정된 파일에서 읽은 텍스트의 각 줄의 처음 두 문자와 일치합니다 file.txt
.) 그리고 (이스케이프 대괄호로 인해) sed
해당 두 문자 중 두 번째 문자는 나중에 참조할 수 있도록 "주석 처리"됩니다.
정규식은 다음과 같기 때문입니다.고정된라인 끝까지 두 점이 일치해야 합니다.마지막텍스트의 각 줄에는 두 개의 문자가 있습니다(마지막 문자는 나중에 참조할 수 있도록 표시됩니다).
(바꾸기) 명령의 다음 부분은 s
다음 문자 s
(이 경우 슬래시 /
)의 두 번째 인스턴스에서 다음 문자의 세 번째 인스턴스로 이동합니다 s
. 이것은 ... 불리운다교체 모드.sed
무엇을 해야 하는지 지정합니다 .바꾸다일치하는 텍스트검색 모드(정규 표현식).
이 경우 교체 패턴은 다음과 같습니다.
\1
마찬가지로 백슬래시도 사용됩니다.탈출하다이 경우 다음 문자는 다음과 같습니다.다음에 추가특별한 의미를 없애는 것이 아니라 특별한 의미를 갖게 되는 것입니다.
백슬래시 뒤에 숫자(1~9)가 붙는 것을 호출합니다.역참조. 이게 뭐야?아나포라검색 패턴에서 대괄호 안에 일치하는 텍스트를 그룹화합니다. 숫자는 이므로 1
이는 다음을 의미합니다.첫 번째브래킷 그룹화. (물론 이 경우에는 그러한 그룹화가 하나만 존재합니다.)
요약하면, 이 편집 명령의 의미는 이스케이프된 대괄호와 일치하는 텍스트를 이스케이프된 대괄호 내에서 일치하는 텍스트(즉, 줄의 마지막 문자)로 바꾸는 것입니다.모두정규식 검색(이것이 마지막입니다.둘줄의 문자).
최종 효과는 각 줄에서 마지막에서 두 번째 문자를 제거하는 것입니다.
또는 더 정확하게는 각 행에 대해 sed
현재 작업 디렉토리에 있는 find라는 파일에서 텍스트의 각 행을 읽고 file.txt
마지막 행을 대체합니다.둘줄의 문자와 줄의 단일 최종 문자는 수정된 각 줄을 해당 줄에 인쇄합니다.표준 출력.