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上,BSD
sed
需要指定后缀;如果不需要备份,则必须使用两个参数:
-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非常感谢!你能把它作为答案贴出来让我接受吗?