Bash 删除文本文件中不包括标题的列的前两个字符
我想删除文本文件中列的前两个字符。 我使用下面的,但这也截断了标题Bash 删除文本文件中不包括标题的列的前两个字符,bash,shell,Bash,Shell,我想删除文本文件中列的前两个字符。 我使用下面的,但这也截断了标题 sed -i 's/^..//' file1.txt 以下是我的档案: FileName,Age ./Acct_Bal_Tgt.txt,7229 ./IDQ_HB1.txt,5367 ./IDQ_HB_LOGC.txt,5367 ./IDQ_HB.txt,5367 ./IGC_IDQ.txt,5448 ./JobSchedule.txt,3851 我希望从文件名的每一行中删除/。根据请求将注释转移到答案 将脚本修改为: se
sed -i 's/^..//' file1.txt
以下是我的档案:
FileName,Age
./Acct_Bal_Tgt.txt,7229
./IDQ_HB1.txt,5367
./IDQ_HB_LOGC.txt,5367
./IDQ_HB.txt,5367
./IGC_IDQ.txt,5448
./JobSchedule.txt,3851
我希望从文件名的每一行中删除/
。根据请求将注释转移到答案
将脚本修改为:
sed -e '2,$s/^..//' file1.txt
2,$
前缀将第2行的更改限制在文件末尾,第1行保持不变
另一种方法是删除
和/
作为行的前两个字符:
sed -e 's%^[.]/%%' file1.txt
我倾向于使用-e
来指定下面的脚本选项;除非将脚本拆分为多个参数,否则这是不必要的(因此,在脚本只有一个参数的情况下,这是不必要的)。您可以使用\.
而不是[.]
;我对反斜杠过敏(如果你曾经花时间研究是否需要连续8次或16次反斜杠才能在troff
文档中获得正确的结果,你就会这样)
建议:在脚本正常运行之前,不要使用
-i
选项。它会用不正确的输出覆盖您的文件,就像用正确的输出覆盖一样。因此,如果您询问如何在SO上编写sed
脚本,那么使用-i
选项是不安全的。还要注意的是,-i
选项是非标准的,在不同版本的sed
中表现不同(如果它完全受支持)。具体而言,在macOS上,BSDsed
需要指定后缀;如果不需要备份,则必须使用两个参数:-i'
使用以下Perl单行程序:
perl -pe 's{^[.]/}{}' file1.txt > output.txt
Perl one liner使用以下命令行标志:-e
:告诉Perl在线查找代码,而不是在文件中。-p
:一次循环输入一行,默认情况下将其分配给$\uu
。在每次循环迭代后添加print$\uz
s{^[.]/}{}
:将一个文字点([.]
)替换为斜杠('/'),该斜杠位于行(^
)的开头,不包含任何内容(删除它们)。这不会修改标头,因为它与正则表达式不匹配
如果希望就地修改文件,可以使用以下方法:
perl -i.bak -pe 's{^[.]/}{}' file1.txt
这将创建备份文件file1.txt.bak
另请参见:在脚本正常运行之前,不要使用
-i
选项。将脚本修改为:sed-e'2,$s/^../'file1.txt
以仅修改第2行和后续行,保持第1行不变。@JonathanLeffler非常感谢!你能把它作为答案贴出来让我接受吗?