使用Sed修改字符串:移除xxd输出指定内容的问题求助
解决xxd输出中移除末尾可变文本的问题
看起来你在处理xxd -bi的输出时遇到了两个小问题:一是条件判断的语法错误,二是没法精准移除末尾的原字符串文本。我来帮你修正脚本,同时优化整个处理流程。
先说说现有脚本的几个问题
- 条件判断里误用了管道符
|代替逻辑或||,这会导致语法错误,无法正确识别输入的大小写变体。 - 第二个sed命令的写法完全不对:单引号里的变量
$convertthis不会被解析,而且你试图匹配的末尾文本是可变的,其实不需要硬匹配原字符串,只要匹配格式特征就行——xxd -bi的输出是地址: 二进制组 原字符串,所以末尾部分是第一个空格之后的所有内容。 - 用
$(sed ...)包裹sed命令是多余的,这会把sed的输出当作系统命令执行,完全没必要。
修改后的完整脚本
echo "What you want to input numbers or string?" read input # 统一转成小写,简化条件判断逻辑 input_lower=$(echo "$input" | tr '[:upper:]' '[:lower:]') if [[ "$input_lower" == "number" ]]; then echo "Number selected 1" elif [[ "$input_lower" == "string" ]]; then echo "String selected" echo "Please give me the string to be XOR'ed" read convertthis # 直接通过管道链式处理,避免临时文件的冗余修改 echo "$convertthis" | xxd -bi | sed -e 's/^00000000://' -e 's/ .*$//' > bin-store else echo "Please re-run the script, input is wrong" fi
关键修改点说明
- 简化条件判断:把输入统一转成小写,只需要一次判断就能覆盖所有大小写输入的情况,代码更简洁。
- 精准的sed替换:
- 第一个替换
s/^00000000://:匹配行首的地址前缀并移除,确保只删除开头的固定地址。 - 第二个替换
s/ .*$//:匹配第一个空格之后的所有内容(包括空格本身)并删除,不管末尾的原字符串是什么,都能精准去掉。
- 第一个替换
- 高效的管道处理:直接把
echo、xxd、sed通过管道连起来,处理完成后直接写入文件,省去了先写文件再修改的冗余步骤。
如果你的输入字符串很长,xxd输出会有多行,这个脚本也能正常处理,因为sed会逐行处理每一行的内容。
内容的提问来源于stack exchange,提问作者Saubhagya Srivastava
相关产品推荐
相关产品推荐

