sed中的命令替换

Har*_*ryH 4 bash sed

我想将一个文本文件的前六个字符读入一个字符串,并在该文件中使用该字符串添加其他所有非空行.这种文件的一个例子可能是:

04/17 Walmart .toys $ 70 .cash $ -70

Caltex .gas 20 $ .cheque $ -20

McDonalds .burger 1 $ .cash $ -1
Run Code Online (Sandbox Code Playgroud)

每个条目,即:每个非空行,都需要一个日期,出于简单数据输入的原因,该日期仅在第一行输入.条目由1个或多个空行分隔.输出看起来像这样:

04/17 Walmart .toys $ 70 .cash $ -70

04/17 Caltex .gas 20 $ .cheque $ -20

04/17 McDonalds .burger 1 $ .cash $ -1
Run Code Online (Sandbox Code Playgroud)

我可以将非空字符串与^ [^ @] + []*之类的东西相匹配.[]([^; {}:] +)[]*$,但我不知道如何为非空行实际实现.

这个Bash脚本对我很有吸引力,但我不知道如何在开始时插入我的字符串.

我也找不到Stack Overflow问题的直接答案.

我尝试了一个接受文件名的脚本:

read -n 6 date < $1
sed 's/^/$(echo $date)/' | \
sed 's/^$(echo $date)\n//' | > $newName
Run Code Online (Sandbox Code Playgroud)

我能够想出将日期与空格(例如字符串:'04/17')前置到每一行,然后从每行中没有任何内容删除它.

但是,似乎sed不接受命令替换:

sed: -e expression #1, char 10: unknown option to `s'
Run Code Online (Sandbox Code Playgroud)

l'L*_*L'l 5

您应该可以使用一个sed命令执行此操作:

read -rn 6 date < "$1"
sed -E 's#^([a-zA-Z]+)#'"$date"' \1#g' "$1" > newfile
Run Code Online (Sandbox Code Playgroud)

捕获组确保在插入日期之前该行上至少有一个字符.

编辑:根据您的问题的修订:

newfile="output.txt"
lineone=$(head -1 "$1");

read -rn 6 date <<< "$lineone"
sed -E 's#^([a-zA-Z]+)#'"$date"' \1#g; 1s#^.*$#'"$lineone"'#' "$1" > "$newfile" 
Run Code Online (Sandbox Code Playgroud)

由于您没有进行就地编辑,您可以执行$ date插入,然后返回并换出第一行,因为它最终会有两个日期.可能有"更好"的方法来执行此操作,例如使用Perl或丢失第二个sed命令,尽管这应该至少为您提供一个基本的想法,但它是如何工作的...

结果(newfile):

04/17 Walmart .toys $ 70 .cash $ -70

04/17 Caltex .gas 20 $ .cheque $ -20

04/17 McDonalds .burger 1 $ .cash $ -1
Run Code Online (Sandbox Code Playgroud)

注意:在某些版本的sed扩展正则表达式的选项可以是-r-E.