현재 들여쓰기된 할 일 목록을 검토하기 위해 이 명령을 실행하고 있습니다.
sed -e 's/\(\s\+- \)\(.*\)/\1XXX/g'
X
s의 수가 일치하는 문자의 수와 일치하기를 원한다는 점을 제외하면 괜찮습니다 . 어떻게 해야 하나요? 올바른 방법은 특별히 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
)에 추가한 다음 \n
ewline 문자를 제거합니다. 따라서 다음과 같은 파일을 사용하십시오.
- 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 문하지만 더 복잡합니다.