영숫자가 아닌 모든 문자를 밑줄로 바꿉니다.

영숫자가 아닌 모든 문자를 밑줄로 바꿉니다.

나는 이것을 가지고있다:

second_arg="${second_arg/[^[:alnum:]]/_}"

내가 이렇게 하면:

second_arg="foo::"
second_arg="${second_arg/[^[:alnum:]]/_}"
echo "$second_arg"

그러면 나는 다음을 얻습니다:

foo_:

영숫자가 아닌 모든 인스턴스를 바꾸는 방법은 무엇입니까? 나는 다음과 같은 전역 스위치를 시도했습니다.

 second_arg="${second_arg/[^[:alnum:]]/_/g}"

그러나 그것은 효과가 없었습니다. 결국 다음과 같이 되었습니다.

foo_:/g

답변1

또는 bash의 변수 확장 기능을 계속 사용하려면 다음을 사용하십시오.슬래시는 각 일치 항목을 대체 항목으로 대체합니다.

second_arg="${second_arg//[^[:alnum:]]/_}"
                         ^------ here

답변2

그리고 sed:

$ echo 'This is a test; specifically it is test number 25!' | sed 's/[^a-zA-Z0-9]/_/g'
This_is_a_test__specifically_it_is_test_number_25_

답변3

Jeff Schaller의 답변을 확장하면 "검색 및 바꾸기" 매개변수 대체가 여러 가지 작업을 수행할 수 있습니다.

반면:s="_one_two_one_two"

  1. 바꾸다첫 번째"둘"

    $ echo ${s/two/X}
    _one_X_one_two
    
  2. 바꾸다모두"둘"

    $ echo ${s//two/X}
    _one_X_one_X
    
  3. 고정된 경우 "two"를 교체합니다.문자열의 끝에서

    $ echo ${s/%two/X}
    _one_two_one_X
    
  4. 고정된 경우 "one"을 교체합니다.문자열의 시작 부분에(아니요, 교체할 수 없습니다)

    $ echo ${s/#one/X}
    _one_two_one_two
    

답변4

bash(사용 중인 경우)에서는 ${arg/one/two}a 의 첫 번째 항목만 대체합니다 . 모든 첫 번째 double을 this 로 on바꾸려면 다음을 수행하십시오./${arg/one/two}

arg=${arg//[^[:alnum:]]/_}

#두 번째 슬래시는 시작과 끝을 나타내 도록 변경할 수 있습니다 %.

문자열이 다음과 같은 경우:

➤ a=one_two_/one_two_one

첫 번째 인스턴스만 변경하려면 다음을 수행합니다 one.

➤ echo ${a/one/xXx}
xXx_two_/one_two_one

첫 번째 예 two:

➤ echo ${a/two/xXx}
one_xXx_/one_two_one

one매개변수로 시작하는 문자열:

➤ echo ${a/#one/xXx}
xXx_two_/one_two_one

one매개변수 끝에 있는 문자열:

➤ echo ${a/%one/xXx}
one_two_/one_two_xXx

문자열 /one(슬래시로 시작):

➤ echo ${a/\/one/xXx}
one_two_xXx_two_one

모든 중복 one:

➤ echo ${a//one/xXx}
xXx_two_xXx_two_xXx

관련 정보