2014-12-13 117 views
0

我是新来的脚本编写,所以这可能是一个'杜'的问题,也许sed/awk不能这样做,我需要将用户输入的文本行插入到文件中,但必须在特定的唯一行之后插入。有问题的线路,如“###插入新的在下面的输入HERE” 我一直在使用:试图理解sed只需要特定文本行的行号

sudo sed -i "9i$userinput from user" ~/filename; 

成功地将用户输入加上额外的文本文件行“之后### INSERT NEW INPUT BELOW HERE“这恰好在第8行,所以我硬编码为9,但是,事实证明,其他脚本可能会在”### INSERT NEW INPUT BELOW HERE“之前添加或减去此文件中的行螺丝我的一切了......我怎么可以识别与文本行的行号“###插入新的在下面的输入HERE”,并将其分配给一个变量,这样也许是这样的:

sudo sed -i "$(linenumber + 1)i$userinput from user" ~/filename; 

可能工作。
我已经试过:

line= "### INSERT NEW INPUT BELOW HERE"; 
linenum= sed -n '/$line/'= inputfile; 
echo linenum; 

linenum=$(awk 'NR == "$line"' ./inputfile) 
echo $linenum; 

连同几个变化,但LINENUM保持为空。

任何帮助或建议?

回答

1

我会直接匹配行而不是计算数字。最简单的方法:

awk -v subst="$userinput from user" '{ print } /### INSERT NEW INPUT BELOW HERE/ { print subst }' filename.txt 

然后将其重定向到文件并将其移回。或者,如果您有GNU awk 4.1或更高版本,请使用

awk -i inplace -v subst="$userinput from user" '{ print } /### INSERT NEW INPUT BELOW HERE/ { print subst }' filename.txt 

以应用所做的更改。

说明:

{ print } 

这一个隐含的“匹配任何”在前面(技术上:“匹配空字符串”,这一切都包含),所以这种打印每行。

/### INSERT NEW INPUT BELOW HERE/ { print subst } 

而且在符合### INSERT NEW INPUT BELOW HERE(即,包含字符串)打印变量subst该线,它被设置为"$userinput from user"-v开关。在斜线之间的东西在技术上是一个正则表达式,但在这种情况下,我们只需要匹配一个静态字符串,我们不使用任何复杂的功能。

与sed相比,awk更健壮,因为如果用户输入对sed有意义的内容(例如反斜杠),sed将抛出。如果使用-v开关,则awk不存在此问题。

如果你真的只是想号码,您可以(非常相似)使用

linenum=$(awk '/### INSERT NEW INPUT BELOW HERE/ { print NR }' filename.txt) 
1

我不认为你的脚本会的工作。如果等号(=)周围的任何空格用于为变量赋值,则Bash将失败。你的sed表达式也是不正确的。或者,也许你只是错误输入,无论如何。

试试这个脚本

line="### INSERT NEW INPUT BELOW HERE"; 
linenum=`sed -n '/'"$line"'/=;q' inputfile` 
echo $linenum; 
+0

为什么不只是搜索'$ line'然后** **我的nsert userInput? – shellter 2014-12-13 03:54:59

+0

@ shellter.From问题,似乎OP只想要该行的行号。 – D3Hunter 2014-12-13 03:57:59

+0

这不是我如何解释O.P.的最终问题。是的,O.P.想要可变的行号,我提供了一个替代方案,只需要一次文件传递。我的意思是看GlennJackman的答案。祝你们好运! – shellter 2014-12-13 04:02:24

1

随着SED,找到行和a PPEND新线

sed -i '/### INSERT NEW INPUT BELOW HERE/a your new line here' file 

(见https://www.gnu.org/software/sed/manual/sed.html#Other-Commands多行插入的复杂性)

例:在“52”后添加一行文字

$ text="this is the new stuff" 
$ seq 50 55 | sed "/52/a $text" 
50 
51 
52 
this is the new stuff 
53 
54 
55 
+0

你需要双引号而不是单引号:请参阅https://www.gnu.org/software/bash/manual/bashref.html#Quoting – 2014-12-13 15:28:44

+0

好吧,这个工程很漂亮,但是,我搞砸了语法,当我尝试用这个变量替换用户输入中的'new line'。 **即。 sed -i'/ ###在下面插入新的输入/ a $ emailaddress'$ inputfile **它将文本“$ emailaddress”添加到正确的位置而不是电子邮件地址。我如何强制它扩大变量? – 2014-12-13 15:52:26

+0

非常感谢...现在就像一个魅力工作...更多为我的片段集合。 2014-12-13 15:56:41

0

您还可以找到并标记行"### INSERT NEW INPUT BELOW HERE"。之后单词采用这一行并添加换行符“\ n”,然后在换行符后追加新行。

命令

sed 's/^\(### INSERT NEW INPUT BELOW HERE\).$/\1\n$userinput from user/g' ~/filename