我有一个CSV.我想编辑CSV的第35个字段并将更改写回第35个字段.这就是我在bash上所做的事情:
awk -F "," '{print $35}' test.csv | sed -i 's/^0/+91/g'
Run Code Online (Sandbox Code Playgroud)
所以,我使用awk拉出第35个条目,然后用"+91"替换字符串中起始位置的"0".这个工作perfet我在控制台上获得所需的输出.
现在我想要将这个新条目写入文件中.我正在考虑sed的"in -place"替换功能,但这个胎儿需要和输入文件.在上面的命令中,我无法提供输入文件,因为我的主命令是awk而sed正在从awk获取输入.
谢谢.
Lev*_*sky 47
您应该选择这两个工具中的一个.至于sed,它可以如下完成:
sed -ri 's/^(([^,]*,){34})0([^,]*)/\1+91\3/' test.csv
Run Code Online (Sandbox Code Playgroud)
不确定awk,但@ shellter的评论可能对此有所帮助.
Wil*_*ell 16
in-placesed 的功能名称错误,因为它不会编辑文件.相反,它会创建一个具有相同名称的新文件.例如:
$ echo foo > foo
$ ln -f foo bar
$ ls -i foo bar # These are the same file
797325 bar 797325 foo
$ echo new-text > foo # Changes bar
$ cat bar
new-text
$ printf '/new/s//newer\nw\nq\n' | ed foo # Edit foo "in-place"; changes bar
9
newer-text
11
$ cat bar
newer-text
$ ls -i foo bar # Still the same file
797325 bar 797325 foo
$ sed -i s/new/newer/ foo # Does not edit in-place; creates a new file
$ ls -i foo bar
797325 bar 792722 foo
Run Code Online (Sandbox Code Playgroud)
由于sed实际上并不是在编辑文件,而是编写新文件然后将其重命名为旧文件,因此您也可以这样做.
awk ... test.csv | sed ... > test.csv.1 && mv test.csv.1 test.csv
Run Code Online (Sandbox Code Playgroud)
有人误以为使用sed -i某种方式可以避免创建临时文件.它不是.它只是隐藏了你的事实.有时抽象是一件好事,但有时候它是不必要的混淆.在这种情况下sed -i,它是后者.shell非常擅长文件操作.按预期使用它.如果您确实需要编辑文件,请不要使用流媒体版本ed; 只是用ed