我想使用 grep 通过管道从 $lastblock 中排除单词,但我发现 grep 仅适用于文件,不适用于 stdout 输出。
废话。 grep 对同一个输入的作用相同,无论是来自文件还是来自标准输入。
所以,这就是我正在使用的:
lastblock="./2.json"
echo $lastblock | sed '1,/firstmatch/d;/.json/,$d'
我想排除 ./ 和 .json,只保留两者之间的内容。这个 sed
命令对于这个目的是正确的,
对于所述目的,该 sed 命令远非正确。它有这样的效果:
- 删除从第一行到下一个匹配正则表达式
/firstmatch/ 的每一行,AND
- 删除从第一个匹配正则表达式
/.json/ 到最后一个文件的每一行(注意. 是一个正则表达式元字符)。
要删除部分行而不是删除整行,请使用s/// 命令而不是d 命令。至于转义,您可以通过在字符前面加上反斜杠 (\) 将字符转义为 sed,它本身必须被引用或转义以保护它不被 shell 解释。此外,大多数正则表达式元字符在出现在字符类中时都会失去其特殊意义,我发现这是将它们作为文字包含在模式中的一种更清晰的方式。例如:
lastblock="./2.json"
echo "$lastblock" | sed 's/^[.]\///; s/[.]json$//'
也就是说要删除出现在(任何)行开头的文字字符./,并分别删除出现在行尾的文字字符.json。
或者,如果您只想修改都以./开头并以.json结尾的行,那么您可以使用带有捕获组和反向引用的单个s命令:
lastblock="./2.json"
echo "$lastblock" | sed 's/^[.]\/\(.*\)[.]json$/\1/'
也就是说,在以./ 开头并以.json 结尾的行上,捕获这两者之间的所有内容,并将整行替换为仅捕获的部分。