使用 Sed 改变字符串

String Alteration Using Sed

一旦我执行 | xxd -bi,我得到的输出是

00000000: 01101000 01100101 01101100 01101100 01101111 00001010 hello.

现在我正在尝试删除初始的 0000000,这是我使用 sed 完成的,我正在尝试使用 sed 删除存储在 $covertthis 中的 "hello"(可变文本),但我不能实现如此,如下例所示,请建议我进行更改。

我也尝试过使用 cut,但不能同时更改 0000000 和最后一个变量字。

echo "What you want to input numbers or string?"
read input

if [[ "$input" == "number" ]] || [[ "$input" == "Number" ]] || [[ "$input" == "NUMBER" ]] ;then
        echo "Number selected 1"
elif [[ "$input" == "String" ]] | [[ "$input" == "STRING" ]] || [[ "$input" == "string" ]] ;then
        echo "String selected"
        echo "Please give me the string to be XOR'ed"
        read convertthis
        echo  $convertthis | xxd -bi > bin-store
        $(sed -i -e 's/00000000://g' bin-store)
        $(sed -i -e 's/($convertthis).//g' bin-store)
else
        echo "Please re-run the script, input is wrong"
fi

你只需要一个 sed。使用 ;

分隔命令
# read convert_this
echo "00000000: 01101000 01100101 01101100 01101100 01101111 00001010  hello." | 
sed -E "s/^[^[:blank:]]*[[:blank:]]+//;s/[[:blank:]]+$convert_this\.$//" 

应该做。

输出

01101000 01100101 01101100 01101100 01101111 00001010

说明

  • 带有 sed-E 选项允许使用扩展正则表达式。
  • s/^[^[:blank:]]*[[:blank:]]+//; 开头的^ 查找行首。 sed 中的 [] 表示范围。如果范围以 ^ 开头,则表示您正在取反范围。 * 外观适用于零个或多个,+ 外观适用于一个或多个。 [:blank:] 是一个字符 class 匹配任何空白字符,如空格标签等。简而言之,我们正在寻找开头后跟一个或多个空格的任何非空白字符。然后我们用任何东西代替它有效地删除它。
  • 第二个替换项替换了 $convert_this 中存储的字符串以及后面的任何句号。

都很好:-)


旁注: 您需要使用双引号将 sed 命令括起来,以便扩展您的 bash 变量。

使用

sed -i -e "s/$convertthis.$//" bin-store 

而不是

$(sed -i -e 's/($convertthis).//g' bin-store)

使用 convertthis 变量的内容而不是其文字名称

以下 awk 也可能对您有所帮助。

awk -v val="hello." '{sub(/^0+: +/,"");sub(val,"")} 1'   Input_file

或者,如果您有一个 shell 变量,我们想将其传递给 awk 命令,那么以下内容也可能对您有所帮助:

convertthis="hello."
awk -v val="$convertthis" '{sub(/^0+: +/,"");sub(val,"")} 1'   Input_file

输出如下。

01101000 01100101 01101100 01101100 01101111 00001010

试试这个命令:

sed "s/\(^[0-9a-z]\{8\}:[[:space:]]\)\([^a-z]*\)\([a-z]*\)//"

正则表达式将输入分成三组匹配;这些组使用转义括号 \( \) 划定。分组如下:

  1. 第一组是字母数字和 8 个字符,前面有一个冒号和一个 space。我们有 ^ 来匹配 then 的开头,8 个字母数字字符与 [0-9a-z]\{8\} 匹配:在这个表达式中,方括号括起一个字符 class(字母数字)。 space 可以匹配 [[:space:]].

  2. 第二组不包含我们匹配为 [^a-z]* 的字母字符,其中 ^ 反转方括号中的匹配。

  3. 第三组匹配末尾的字母字符

然后我们可以用三个组中的任何一个替换字符串:组 2 (\2) 是我们想要的那个。

这与 sed 逐行匹配一样适用于多行输入。


旁注:为了 POSIX 符合性以匹配 spaces [[:space:]] 应该使用 而不是 \s (参见 this question)。