Skip to content

Instantly share code, notes, and snippets.

@x-yuri
Created October 20, 2024 08:32
Show Gist options
  • Select an option

  • Save x-yuri/d56c5f194bcb7c5f6035e99e748fa336 to your computer and use it in GitHub Desktop.

Select an option

Save x-yuri/d56c5f194bcb7c5f6035e99e748fa336 to your computer and use it in GitHub Desktop.
BRE/ERE: escape special chars

BRE/ERE: escape special chars

a.bats:

setup() {
    load bats-support/load
    load bats-assert/load
}

# https://www.gnu.org/software/sed/manual/html_node/BRE-syntax.html
# https://www.gnu.org/software/sed/manual/html_node/ERE-syntax.html
qbre() {
    local s=$1 d=${2-}
    local re='\*|\.|\^|\$|\[|\\'  # * . ^ $ [ \
    if [ "$d" ]; then
        re=$re'|\'$d
    fi
    printf '%s\n' "$s" | sed -E 's/('"$re"')/\\&/'
}

qere() {
    local s=$1 d=${2-}
    local re='\*|\.|\^|\$|\[|\\|\?|\+|\{|\|'  # * . ^ $ [ \ ? + { |
    if [ "$d" ]; then
        re=$re'|\'$d
    fi
    printf '%s\n' "$s" | sed -E 's/('"$re"')/\\&/'
}

@test "bre: *" {
    s=`qbre '*'`
    run sed /."$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "bre: ." {
    s=`qbre .`
    run sed /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "bre: ^" {
    s=`qbre ^`
    run sed /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "bre: $" {
    s=`qbre $`
    run sed /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "bre: [" {
    s=`qbre \[`
    run sed /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "bre: \\" {
    s=`qbre \\`
    run sed /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "bre: /" {
    s=`qbre / /`
    run sed /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: *" {
    s=`qere '*'`
    run sed -E /."$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: ." {
    s=`qere .`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: ^" {
    s=`qere ^`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: $" {
    s=`qere $`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: [" {
    s=`qere \[`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: \\" {
    s=`qere \\`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: ?" {
    s=`qere \?`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: +" {
    s=`qere +`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: {" {
    s=`qere \{`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: |" {
    s=`qere \|`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}

@test "ere: /" {
    s=`qere / /`
    run sed -E /"$s"/d < <(echo 'a')
    assert_success
    assert_output 'a'
}
$ git clone https://github.com/bats-core/bats-core
$ git clone https://github.com/bats-core/bats-assert
$ git clone https://github.com/bats-core/bats-support
$ bats-core/bin/bats a.bats
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment