打印第 n 个分隔符之前的所有内容

打印第 n 个分隔符之前的所有内容

我正在寻找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")}'

相关内容