특정 문자열 뒤에 오는 문자 사이의 간격을 조정하는 방법은 무엇입니까?

특정 문자열 뒤에 오는 문자 사이의 간격을 조정하는 방법은 무엇입니까?

큰 파일이 있습니다 ~/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>YX와 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

관련 정보