我正在寻找sed
像这里这样的解决方案:打印第 n 个分隔符之后的所有内容
sed -E 's/^([^\]*[\]){3}//' infile
但要提取第 n 个分隔符之前的文本,而不是像示例中那样提取第 n 个分隔符。适用于所有 sed 变体的东西。并像示例一样对所有行进行操作。
此示例中的分隔符是\
但可以是任何其他分隔符。应该适用于任何版本的 sed。
答案1
你为什么不使用cut
?
cut -d '\' -f 1-3 infile
使用sed
,不是删除匹配,而是捕获它并使用反向引用将整行替换为捕获的组:
sed -E 's/(^([^\]*[\]){3}).*/\1/' infile
虽然这也会打印结尾的反斜杠......为了避免这种情况,你可以运行
sed -E 's/(^([^\]*[\]){2}[^\]*).*/\1/' infile
答案2
更短的 awk:
awk NF=3 FS='\\' OFS='\\'
- 定义输入和输出字段分隔符
- 设置要保留的字段数
答案3
您可以用换行符替换第 n 个分隔符(否则换行符不会出现在模式空间中),然后删除以换行符开头的所有内容。这里对于 n == 3:
sed 's/delim/\
/3; P; d'
或者如果必须在输出中保留第n 个分隔符:
sed 's/delim/&\
/3; P; d'
要跳过没有 n 分隔符的行:
sed -n 's/delim/\
/3; t1
d; :1
P'
答案4
使用awk
:
$ awk -v var=3 'BEGIN{FS=OFS="\\"}
(NF>=var){ split($0,arr,OFS);
$0="";
for (i=1; i<=var; ++i) $(NF+1)=arr[i];
print}'
要保留第 n 个分隔符,可以使用以下命令。
$ awk -v var=3 'BEGIN{FS=OFS="\\"}
(NF>=var){ for (i=1; i<=var; ++i) printf "%s%s", $i, OFS; print ""}'
$ nawk '(match($0, /^([^\\]*[\\]){3}/))
{ print substr($0,RSTART,RLENGTH)}'
和GNU awk
:
以下命令使用反向引用捕获的组。这是一个 awk 命令,取自这个答案。感谢@don_crissti
$ awk -F "\\" -v col=3 '(NF>=col){print gensub(/(^([^\\]*[\\]){3}).*/, "\\1", "g")}'