我必须使用sed
来匹配固定字符串。
我在一个文件中有一个伪数据库,如:
key\x0value
keyyy\x0value
如果我使用第一行作为参数“key”而不是“ey”。 *与钥匙匹配:“钥匙” *不匹配:“k”,“ke。”,“ey”,......:没有正则表达式,没有部分搜索,只有“键”
我无法使用awk
,并且字符串必须在键的末尾包含\x0
。
似乎我不能使用grep,因为它不处理\ x0或\ 0
问题是我不能同时要求匹配/ ^ key \ x0 /并且不用正则表达式解释密钥。
最后,我的嫌疑人将只采取一个论点:匹配的确切关键。
答案 0 :(得分:1)
sed
没有匹配固定字符串的工具。但是,可以通过首先转义要匹配的字符串中的所有特殊字符来实现相同的效果。如果提供了一个键作为此脚本的第一个参数,它将仅打印file
中包含该键的行:
#!/bin/bash
printf -v script '/^%s\\x00/p' "$(sed 's:[]\[^$.*/]:\\&:g' <<<"$1")"
sed -n "$script" file
有关此代码的详细信息,请参阅this answer。
答案 1 :(得分:0)
我也遇到了这个问题,上面的答案是不够的,实际上是特定于John1024链接的答案,以获取更多详细信息。它包含空字节,此处不适用。
要匹配固定的字符串,可以使用以下命令:
#!/bin/bash
# These can be anything
OUTER_STRING='hello $( string | is [ a ${ crazy } mess ] like wow; end'
INNER_STRING=' $( string | is [ a ${ crazy } mess ] like wow; en'
# This is the meat and potatoes
CLEAN_SED_STRING="$(echo "$INNER_STRING" | sed 's:[]\[^$.*/]:\\&:g')"
echo "$OUTER_STRING" | sed "s/$CLEAN_SED_STRING/ worl/"
为了更清洁,我做了一个bash函数,它掩盖了复杂性。在OSX,CentOS,RHEL6和Ubuntu上进行了测试。它只能处理的两个字符是null(\ x00)和换行符(\ x0a)
function substitute {
if [[ "$#" == "2" ]] || [[ "$#" == "3" ]]; then
# Input from stdin
HAYSTACK="$(/bin/cat -)"
NEEDLE="$1"
NEEDLESUB="$2"
REGEX_FLAGS="$3"
else
echo "Usage: echo <HAYSTACK> | substitute <NEEDLE> <NEEDLESUB> [FLAGS]"
echo "Example: echo 'hello w' | substitute 'w' 'world'"
echo "Example: echo 'hello w' | substitute 'O' 'xxxxx' 'gi'"
fi
CLEAN_SED_STRING="$(echo "$NEEDLE" | sed 's:[]\[^$.*/&]:\\&:g')"
CLEAN_SED_SUBSTRING="$(echo "$NEEDLESUB" | sed 's:[]\[^$.*/&]:\\&:g')"
echo "$HAYSTACK" | sed "s/$CLEAN_SED_STRING/$CLEAN_SED_SUBSTRING/$REGEX_FLAGS"
}
# Simple usage
echo 'Hello Arthur' | substitute 'Arthur' 'World'
# Complex usage
echo '/slashes$dollars[square{curly' | substitute '$dollars[' '[]{}()$$'
# Standard piping
echo '
The ghost said "ooooooOOOOOooooooOOO"
The dog said "bork"
' | substitute 'oo' 'ee'
# With global flag and chaining
echo '
The ghost said "ooooooOOOOOooooooOOO"
The dog said "bork"
' | substitute 'oo' 'ee' 'g' | substitute 'ghost' 'siren'