如何用一个命令编辑多个文本文件?


18

我想删除多个文本文件的第一行,并用另一行替换它。是否可以使用终端执行此操作?

我知道如何使用vim,有没有办法使其自动化?我想避免手动进行操作(如分别编辑每个文件一样)。

如果可能的话,我想避免安装新的库(尤其是对于我认为非常简单的库,但我可能是错的)。

提前致谢!

Answers:


21

您可以使用sed

sed -i.bak '1s/^.*$/new line/' *.txt

这将用.txt文本替换当前目录中所有文件的第一行,并new line对其进行更改以满足您的需要。

.bak如果您不希望使用扩展名,也可以使用扩展名备份原始文件:

sed -i '1s/^.*$/new line/' *.txt

谢谢!sed实际上就是我想要的!
TomTsagk

@TomTsagk Glad我可以帮忙:)
heemayl 2015年

11

好吧,使用vim自身:

vim -Nesc 'bufdo call setline(1,"This is the replacement.") | wq' file1 file2 ...

这是做什么的:

  • setline (n, text),很好,是一个函数,集线ntext
  • call 需要调用函数。
  • bufdo 用于在缓冲区之间重复命令(无范围,它作用于所有缓冲区)。
  • wq保存并退出缓冲区。我们需要在继续下一个缓冲区之前执行此操作,因此此call命令使用链接到该命令|
  • -c cmdcmd加载第一个缓冲区后,runs 是一个命令模式命令。
  • Nes 打开不兼容的无声ex模式,这对于非交互式处理更好。

好处:

  • setline文本内容可以是任何东西-一个&sed替换文本可以产生意想不到的效果。

sed看起来更容易使用,但是做起来真的很棒vim!非常感谢您的回答!
TomTsagk

@TomTsagk很好,我只是想说明一下如何处理多个文件(bufdo)。考虑您已经打开了文件并...并显示的替代文件1s/foo/bar/
muru 2015年

太棒了!!! <3_ <3
坎帕2015年

3

其他一些选择:

  • awk(需要一个相对较新的GNU版本awk

    $ awk -i inplace -vline="new line" '(FNR==1){print line; next}1;' *.txt
    
  • Perl /壳

    $ for f in *txt; do
        perl -i -lne '$.==1 ? print "new line" : print' "$f"
      done
    
  • 外壳/ coreutils

    $ for f in *txt; do 
        ( echo "new line"; tail -n+2 "$f" ) > foo && mv foo "$f"; 
      done
    

2

该脚本将按您的要求执行,将更改后的文件放置在新目录中,而无需实际更改原始文件。

d=/tmp/cooked
mkdir $d
for f in *  #will match all files in current directory; adjust as desired
do
  echo "This is the new 1st line" > /${d}/${f}
  sed 1d ${f} >> /${d}/${f}
done

我的回答很慢(测试了我的代码)...而且我更喜欢heemayl的解决方案!
2015年

0

使用 gawk

gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt 
1
2
3
4

% cat bar.txt 
1
2
3
4

% gawk -i inplace 'FNR==1 {$_="your_replacement"}; {print}' *.txt

% cat foo.txt                                                    
your_replacement
2
3
4

% cat bar.txt                                                    
your_replacement
2
3
4

0

jEdit:我用它来查找和替换。它具有使用RegEx-正则表达式的功能,功能强大。您可以对目录中的文件进行操作,指定文件扩展名,例如“ .html”等。并且,您可以在GUI中查看上下文中候选更改的语言环境。jEdit很棒。

jEdit可通过Ubuntu的软件中心获得。


0

tail和cat命令可以轻松地做到这一点:

tail -n +1 $file > tmpfile
cat newfirstline tmpfile >$file

将它们包装在适当的循环中,并可能使用正确的正义临时文件,而不是硬编码的临时文件名。我相信bash和其他shell具有用于创建临时文件的语法。

tail的-n选项有两种解释,具体取决于参数是否带有加号。如果它带有加号,则表示给定的行号开始显示文件的末尾。否则,数字是应该输出的行数,包括最后一行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.