试图让这个表达起作用,有人可以看一下并告诉我离我有多远吗?
我试图让第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
答案 0 :(得分:5)
如果您对基于awk
的解决方案感兴趣,并假设我在上述评论中对您的请求的解释是正确的:
awk -F, 'BEGIN { OFS = "," } $1 { last = $1 } !$1 { $1 = last } { print }' SedExit.txt
编辑:简要说明 -
-F,
告诉awk使用逗号作为输入字段分隔符;它会自动分裂
逗号上的行,并使单个字段可用为$ 1,$ 2等($ 0是整行)
BEGIN {
代码}
在awk运行开始时在大括号中运行一次代码。
OFS = ","
将输出字段分隔符设置为逗号,以匹配输入。这让我们可以直接修改字段并仍然以逗号分隔输出,而不必在代码中重建整行。
其余代码每行输入运行一次:
$1 { last = $1 }
第一个$1
是下一个要执行的代码块必须满足的条件:如果当前行的那个字段为真(非空),则为块运行。该块将该字段的副本保存在名为“last”的新变量中。
因此,如果在第一个逗号之前有任何内容,我们会记住它以供以后使用。
!$1 { $1 = last }
此处的条件被否定,因此只有第一个字段为空时才会运行此块。在这种情况下,我们复制另一种方式,并将第一个字段设置为last
的值。希望我们之前看到过与第一个块匹配的行并将last
设置为某个行,或者这没用。
{ print }
这里没有条件,因此代码在每一行上运行,它只是打印出来。如果适用,输出将包含我们对$ 1的修改。
答案 1 :(得分:1)
您希望将第一行的第一个字段复制到每个后续行的第一个字段中,最好使用sed。
将第一个字段存储在变量中,然后在行范围内执行sed表达式。
FIELD1=$(head -n1 /tmp/foo | cut -d, -f1)
sed "2,$ s/^.*,/$FIELD1,/" /tmp/foo
答案 2 :(得分:1)
这可能对您有用:
sed '/^,/!{h;b};G;s/\(.*\)\n\([^,]*\).*/\2\1/' file
说明:
/^,/!{h;b}
G
s/\(.*\)\n\([^,]*\).*/\2\1/