2016-11-03 2 views
1

안녕하세요. 그래서 "aabbaabbbaab"이라는 문자열이 있다고 가정 해 보겠습니다. 보시다시피 3 블록의 "b"가 있습니다. 예를 들어, b 블록의 두 번째 블록을 제거하려면 어떻게해야합니까? "bbb"? 문자열을 "aabbaaaab"로 바꿔야합니다. 나는 사방을 보려고 노력했다. 그러나 나는 단지 나의 특정한 질문을위한 올바른 구문을 생각할 수 없었다.순수한 bash에서 특정 문자 블록을 제거 하시겠습니까?

+2

내 GNU이 나오지 된 대답 : ''S/B \ + // 2'' – Aaron

+0

을 나오지 @ Aaron Hey 만약 내가 결국 sed없이 이것을하는 방법을 이해할 수 없다면 당신의 접근 감사를 사용할 것입니다. – foobarbaz

+1

왜 sed 또는 awk가 없습니까? 이것들은 POSIX 툴이며 BASH가 존재하는 곳에서는 99.999 %가 존재할 것입니다. – dawg

답변

1

다음은 순수한 bash입니다. 문자를 기준으로 문자열을 반복합니다. 지정된 char의 n 번째 블록에 있음을 감지하면 여기까지 전체 문자열이 우리가 원하는 출력의 첫 번째 부분입니다. n 번째 블록의 끝까지 가면 나머지 문자열이 필요하다는 것을 알 수 있습니다.

remove_nth_block() { 
    local str=$1 char=$2 n=$3 
    local i count=0 prev prefix 
    for ((i=0; i<${#str}; i++)); do 
     if [[ ${str:i:1} = $char && $prev != $char ]]; then 
      ((++count == n)) && prefix=${str:0:i} 
     else 
      if [[ ${str:i:1} != $char && $prev = $char && $count -eq $n ]]; then 
       echo "$prefix${str:i}" 
       return 
      fi 
     fi 
     prev=${str:i:1} 
    done 
} 

그런

여기에서 "전혀 나오지도"요구 사항에 대한 당신의 마음을 바꿀 경우
$ remove_nth_block aabbaabbbaab b 2 
aabbaaaab 
$ remove_nth_block aabbaabbbaab a 2 
aabbbbbaab 
+0

축하해, 나는 비슷한 해결책을 시도하고 좌절감에 버렸다. 'bash'는 다양한 도구 상자가 없으면 훌륭한 언어가 아닙니다. – Aaron

+0

그리고 정말 느립니다. –

1

bbb을 아무 것도 입력하지 않으면 myString을 출력해야합니다. bash에서 문자열 조작에 대한 유용한 팁과 예제를 보려면 this 사이트를 확인하십시오.

myString="aabbaabbbaab" 
echo ${myString//bbb/} 
+0

안녕하세요, 답장을 보내 주셔서 감사합니다. 사용자 입력을 기반으로 N 번째 블록을 찾을 수 있어야합니다. 예를 들어 "bb"라고 입력하면 b의 두 번째 블록을 찾아 해당 블록을 제거해야합니다. – foobarbaz