정규식을 사용하여 텍스트 검토

정규식을 사용하여 텍스트 검토

현재 들여쓰기된 할 일 목록을 검토하기 위해 이 명령을 실행하고 있습니다.

sed -e 's/\(\s\+- \)\(.*\)/\1XXX/g'

Xs의 수가 일치하는 문자의 수와 일치하기를 원한다는 점을 제외하면 괜찮습니다 . 어떻게 해야 하나요? 올바른 방법은 특별히 sed를 사용할 필요가 없습니다.

현재 입력 예시:

- Hello World
  - Earth

산출:

- XXX
  - XXX

예상하다:

- XXXXXXXXXX
  - XXXXX

답변1

펄 솔루션:

perl -pe 's/^( *- )(.+)/$1."X"x length($2)/e'

이는 교체에서 "X" x length($2)올바른 수의 s를 얻는 데 사용됩니다.X

테스트 입력:

- Hello World
  - Earth
This is not - censored

산출:

- XXXXXXXXXXX
  - XXXXX
This is not - censored

답변2

다음과 같이 할 수도 있습니다 sed.

sed '/^[[:blank:]]*-[[:blank:]]/{
h
s///
s/./X/g
x
s/\([[:blank:]]*-[[:blank:]]\).*/\1/
G
s/\n//
}' infile

h이는 이전 버퍼 에 줄을 복사 하고 첫 번째 부분을 제거 [[:blank:]]*-[[:blank:]]하고 나머지 문자를 로 바꾼 X다음 x모드/예약 공간을 변경하므로 이제 검토 중인 문자열은 유지 모드에 있고 원래 줄은 패턴 공간으로 반환됩니다. 줄의 두 번째 부분을 제거하고 s/\(...\).*//예약된 공간의 문자열을 패턴 공간( G)에 추가한 다음 \newline 문자를 제거합니다. 따라서 다음과 같은 파일을 사용하십시오.

- line here
not - to be modified
  - a b c d e
 - another line-here

출력은 다음과 같습니다

- XXXXXXXXX
not - to be modified
  - XXXXXXXXX
 - XXXXXXXXXXXXXXXXX

공백 문자를 제거하고 공백이 아닌 문자만 다음으로 바꾸려는 경우 X:

sed '/^[[:blank:]]*-[[:blank:]]/{
h
s///
s/[[:blank:]]//g
s/./X/g
x
s/\([[:blank:]]*-[[:blank:]]\).*/\1/
G
s/\n//
}' infile

산출:

- XXXXXXXX
not - to be modified
  - XXXXX
 - XXXXXXXXXXXXXXXX

또는 한 줄에 다음을 포함합니다 gnu sed.

sed -E '/^[ \t]*-[ \t]/{h;s///;s/[ \t]//g;s/./X/g;x;s/([ \t]*-[ \t]).*/\1/;G;s/\n//}' infile

^[[:blank:]]*-[[:blank:]]필요에 따라 정규식을 조정하세요(예:).

답변3

$ awk '/^[ ]*- /{gsub(/[^ -]/,"X",$0)}1' <<EOM
- Hello
  - World 2015
This is not - censored
EOM

- XXXXX
  - XXXXX XXXX
This is not - censored

이 표현식은 문자(선택적 공백 뒤)로 시작하는 모든 줄을 awk찾습니다 . -일치하는 줄의 경우 이 명령은 공백과 문자를 제외한 모든 문자를 gsub()바꿉니다 . -마지막 것은 전체 줄을 다시 인쇄하는 1바로 가기입니다 .{print $0}

편집하다: 공백 문자도 제거/교체해야 하기 때문에 X추가 교체를 수행하는 것 외에는 더 우아한 솔루션을 생각할 수 없습니다.

$ awk '/^[ ]*- /{gsub(/[^ -]/,"X",$0);gsub(/X X/,"XXX",$0)}1' <<EOM
- Hello World
  - Earth
This is not - censored
EOM

- XXXXXXXXXXX
  - XXXXX
This is not - censored

답변4

위 줄의 공백이 중요하지 않은 경우 다음 줄을 사용할 수 있습니다.

Q='Some things\n - Hellow World\n   - Earth\nSome things Else'
echo -e "$Q" | awk '{ if ($0 ~ /^\s+-\s\w+/) print system("echo " $0 "| tr [:alnum:] x "); else print $0; }'  | grep -v ^0$

$0 ~ /^\s+-\s\w+/언급한 정규식을 확인하세요.

system(...)달리기불다내부 명령awk

grep -v ^0$부분적으로는 system(...)돌아오기 때문입니다.종료 코드 상태.

우리는 없앨 수 있어요grep -v ^0$그리고getline I/O 문하지만 더 복잡합니다.

관련 정보