这主要是出于好奇心,我试图拥有相同的行为:
echo -e "test1:test2:test3"| sed 's/:/\n/g' | grep 1
在单个sed
命令中。
我已经试过了
echo -e "test1:test2:test3"| sed -e "s/:/\n/g" -n "/1/p"
但我得到以下错误:
sed: can't read /1/p: No such file or directory
你知道如何修复这个问题并将不同类型的命令组合到单个sed
调用中吗?
当然,与真实的用例相比,这过于简单了,而且我知道我可以通过使用多个调用来解决问题,同样,这只是出于好奇。
编辑:我最感兴趣的是sed
工具,我已经知道如何使用其他工具,甚至是这些工具的组合。
EDIT2:这是一个更现实的脚本,更接近我想要实现的目标:
arch=linux64
base=https://chromedriver.storage.googleapis.com
split="<Contents>"
curl $base \
| sed -e 's/<Contents>/<Contents>\n/g' \
| grep $arch \
| sed -e 's/^<Key>\(.*\)\/chromedriver.*/\1/' \
| sort -V > out
我想要简化的是卷曲线,把它变成类似于:
curl $base \
| sed 's/<Contents>/<Contents>\n/g' -n '/1/p' -e 's/^<Key>\(.*\)\/chromedriver.*/\1/' \
| sort -V > out
发布于 2019-06-27 05:08:57
这可能适用于您(GNU sed):
sed 's/:/\n/;/^[^\n]*1/P;D' file
替换每个:
,如果模式空间中的第一行包含1
,则打印它。重复一遍。
另一种选择:
sed -Ez 's/:/\n/g;s/^[^1]*$//mg;s/\n+/\n/;s/^\n//' file
这会将整个文件存储到内存中,并用换行符替换所有冒号。删除所有不包含1的行,并删除多余的换行符。
发布于 2019-06-27 07:32:35
这根本不是sed的工作。使用多字符RS的GNU awk:
$ echo "test1:test2:test3:test4:test5:test6"| awk -v RS='[:\n]' '/1/'
test1
$ echo "test1:test2:test3:test4:test5:test6"| awk -v RS='[:\n]' 'NR%2'
test1
test3
test5
$ echo "test1:test2:test3:test4:test5:test6"| awk -v RS='[:\n]' '!(NR%2)'
test2
test4
test6
$ echo "foo1:bar1:foo2:bar2:foo3:bar3" | awk -v RS='[:\n]' '/foo/ || /2/'
foo1
foo2
bar2
foo3
对于任何\n
,在对其进行操作之前,您只需从最终记录中剥离它:
$ echo "test1:test2:test3:test4:test5:test6"| awk -v RS=':' '{sub(/\n$/,"")} /1/'
test1
https://stackoverflow.com/questions/56771698
复制相似问题