1

试图让这种表达方式发挥作用,有人可以看看它并告诉我离我有多远吗?

我试图在第 1 行获取信息以传播到其他空白行。

Line 1 = "1234, type"
Line 2..99 = ", type"

结果:第 1 行.. =“1234,类型”

这是表达式

sed -i -R -n '{(^[^,]{});x;n;^,;s/^.{}/\1/;x;p;x;p}' SedExit.txt > Str.txt
4

3 回答 3

5

以防万一您对awk基于 - 的解决方案感兴趣,并假设我在上面的评论中对您的请求的解释是正确的:

awk -F, 'BEGIN { OFS = "," } $1 { last = $1 } !$1 { $1 = last } { print }' SedExit.txt 

编辑:简要说明-

-F,告诉 awk 使用逗号作为输入字段分隔符;它将自动以逗号分隔行,并使各个字段可用作 $1、$2 等($0 是整行)

BEGIN {code}在 awk 运行开始时,在处理任何输入之前运行大括号中的代码一次。

OFS = ","将输出字段分隔符设置为逗号,以匹配输入。这让我们可以直接修改字段并且仍然获得逗号分隔的输出,而不必在我们的代码中重构整行。

其余代码每行输入运行一次:

$1 { last = $1 } 第一个$1是执行下一个代码块必须满足的条件:如果当前行的该字段为真(非空),则运行该块。该块将该字段的副本保存在一个名为“last”的新变量中。

因此,如果第一个逗号之前有任何内容,我们会记住它以备后用。

!$1 { $1 = last } 这里的条件被否定,所以这个块只有在第一个字段为空时才会运行。在这种情况下,我们以另一种方式复制,并将第一个字段设置为 的值last。希望我们之前已经看到了与第一个块匹配并设置last为某些内容的行,否则这没有用。

{ print } 这里没有条件,所以代码在每一行都运行,它只是打印出来。如果适用,输出将包含我们对 $1 的修改。

于 2012-06-14T02:35:15.737 回答
1

这可能对您有用:

sed '/^,/!{h;b};G;s/\(.*\)\n\([^,]*\).*/\2\1/' file

解释:

  • 如果该行不以逗号开头,则将该行保存在保持空间 (HS) 中并中断,即不进一步处理但打印该行。/^,/!{h;b}
  • 如果该行确实以逗号开头,请将换行符和 HS 的内容附加到模式空间 (PS)。G
  • 将 HS 中的第一个字段(直到第一个逗号)添加到当前行并删除所有其他剩余部分。s/\(.*\)\n\([^,]*\).*/\2\1/
于 2012-06-14T21:03:11.550 回答
1

问题陈述

您希望将第一行的第一个字段复制到每个后续行的第一个字段中,最好使用 sed。

解决方案

将第一个字段存储在变量中,然后在行范围上执行 sed 表达式。

FIELD1=$(head -n1 /tmp/foo | cut -d, -f1)
sed "2,$ s/^.*,/$FIELD1,/" /tmp/foo
于 2012-06-14T03:18:54.530 回答