使用 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]*\)//"
正则表达式将输入分成三组匹配;这些组使用转义括号 \( \) 划定。分组如下:
第一组是字母数字和 8 个字符,前面有一个冒号和一个 space。我们有 ^ 来匹配 then 的开头,8 个字母数字字符与 [0-9a-z]\{8\} 匹配:在这个表达式中,方括号括起一个字符 class(字母数字)。 space 可以匹配 [[:space:]].
第二组不包含我们匹配为 [^a-z]* 的字母字符,其中 ^ 反转方括号中的匹配。
第三组匹配末尾的字母字符
然后我们可以用三个组中的任何一个替换字符串:组 2 (\2) 是我们想要的那个。
这与 sed 逐行匹配一样适用于多行输入。
旁注:为了 POSIX 符合性以匹配 spaces [[:space:]] 应该使用 而不是 \s (参见 this question)。
一旦我执行 | 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]*\)//"
正则表达式将输入分成三组匹配;这些组使用转义括号 \( \) 划定。分组如下:
第一组是字母数字和 8 个字符,前面有一个冒号和一个 space。我们有 ^ 来匹配 then 的开头,8 个字母数字字符与 [0-9a-z]\{8\} 匹配:在这个表达式中,方括号括起一个字符 class(字母数字)。 space 可以匹配 [[:space:]].
第二组不包含我们匹配为 [^a-z]* 的字母字符,其中 ^ 反转方括号中的匹配。
第三组匹配末尾的字母字符
然后我们可以用三个组中的任何一个替换字符串:组 2 (\2) 是我们想要的那个。
这与 sed 逐行匹配一样适用于多行输入。
旁注:为了 POSIX 符合性以匹配 spaces [[:space:]] 应该使用 而不是 \s (参见 this question)。