큰 파일이 있습니다 ~/foo.txt
. 수천 줄의 테이블
SIZE : X Y
파일 전체에 분산되어 있으며, 여기서 sum 은 정수 X
입니다 . Y
내 문제는 때로는 정수가 두 개의 공백으로 구분되고 때로는 하나의 공백으로 구분된다는 것 X
입니다 Y
. 간격을 일관되게 만들기 위해 Perl 스크립트를 작성하고 싶습니다. 가급적이면 두 개의 공백을 사용하는 것이 좋습니다. 어떻게 해야 하나요?
답변1
당신은 정수라고 말했지만 양수를 의미한 것 같습니다. 시도해 볼 수 있는 대략적인 빠른 해결 방법은 다음과 같습니다.
sed 's/\([0-9]\+\)\s\+\([0-9]\+\)/\1 \2/g'
여기에는 두 번째 숫자가 빼기 기호로 시작하거나 공백이 있는 경우와 같은 몇 가지 주의 사항이 있습니다.아니요a53
예를 들어, 다음과 같은 사이에 발생하는 상황을 처리하고 싶습니다 27B
. 아니면 원하지 않는다면모두숫자는 두 개의 공백으로 구분됩니다. 하지만 이것은 원하는 대로 수정할 수 있는 시작입니다.
질문을 다시 읽으면 "압착"하려는 모든 공백이 "SIZE"라는 단어로 시작하는 줄에 특히 나타나는 것 같습니다. 이렇게 하면 상황이 훨씬 간단해집니다. "연속 공백의 다른 인스턴스"를 보존하고 싶다고 말씀하셨는데, 이것이 다른 줄에 있는 것처럼 들립니다. 따라서 이 경우에는 다음을 사용하십시오.
sed '/^SIZE/ s_\s\s\+_ _'
(대체 텍스트에는 공백이 2개 있습니다.)
다시 읽어보니 이제 고치고 싶은 마음이 들더군요하나공간은 두 개의 공간이 됩니다. 이는 해당 행의 특정 형식에 따라 다르지만 다음과 같이 말하고 싶습니다.
sed '/^SIZE/ s_\s\+_ _3'
그것은 이루어져야합니다. (제공한 예제에서는 작동합니다.) 이렇게 3
하면 다음 경우에만 대체가 발생합니다.세 번째 장소일치 \s\+
- Chaos가 설명했듯이 이는 "하나 이상의 공백 또는 탭"을 의미합니다. 따라서 에서는 SIZE<space>:<space>X<space>Y
X와 Y 사이의 공간을 두 개의 공간으로 바꿉니다.
답변2
그리고 sed
:
sed -i 's/\([0-9]\)\s\+\([0-9]\)/\1 \2/' file
-i
파일을 제자리에서 편집하세요.[0-9]
: 번호를 검색합니다.\s+
: 숫자 뒤에는 공백이나 탭 문자가 옵니다.[0-9]
: , 그 뒤에 다시 숫자가 옵니다.\1 \2
두 숫자는 역참조에 저장되었으며\1
이제\2
두 개의 공백으로 구분됩니다.
예:
$ cat file
SIZE : 2 1 # 2 spaces
SIZE : 1 22 # 1 space
SIZE : 1 1 # 4 spaces
SIZE : 324 34 # a tab
SIZE : 324 34 # 2 tabs
$ sed 's/\([0-9]\)\s\+\([0-9]\)/\1 \2/' file
SIZE : 2 1
SIZE : 1 22
SIZE : 1 1
SIZE : 324 3
SIZE : 324 34
답변3
sed 's/\([0-9] \) *\([-+.]*[0-9]\)/\1 \2/g' <in >out