我有数百个*.txt
具有通用格式的文件。
我可以在一个文件中的特定位置插入逗号,如何概括以下代码以*.txt
在目录中的所有文件的多个位置应用此操作?
sed -i 's/^\(.\{4\}\)/\1,/' blank.txt
例如在位置 4、8、22 等处插入逗号。
也许是这样的?
for i in *.txt; do
sed -i 's/^\(.\{4\}\)/\1,/' $i
done
答案1
在一个一般的方式,你可以这样做:
sed 's/./&,/4' <in >out
这将在输出上将逗号附加到至少包含那么多字符的所有输入行的第四个字符。
而且,如果你接受我的建议,通常你应该不是使用-i
开关切换到任何sed
提供的选项。
答案2
从最右边开始:
sed -i 's/./&,/22;s/./&,/8;s/./&,/4' ./*.txt
否则,第一个替换将影响第二个替换的偏移量。但你总是可以解释它:
sed -i 's/./&,/4;s/./&,/9;s/./&,/24' ./*.txt
答案3
当您提到“在位置 4,8 和 22”时,sed 的意思是“在位置 3,7 和 21 之后”。您想要插入现有文本并保持原样。
这?:
sed -i -r "s/^(.{3})/\1,/;s/^(.{7})/\1,/;s/^(.{21})/\1,/" $(dirname "$0")/blank.txt
-i = --in-place 又名直接在现有文件中更改,-r = 正则表达式,\1 = 指括号之间的“组”,$(dirname "$0") = 保留在当前目录中
当您想要在文件中的某些位置设置制表符而不是空格并用单个空格分隔行时,可以使用类似的 sed:
sed -i -r "s/^(.{10})./\1\t/;s/^(.{20})./\1\t/;s/^(.{30})./\1\t/" $(dirname "$0")/blank.txt
用制表符替换位置 11、21 和 31 处的字符(在本例中为单个空格)。创建的列内的空间保持不变。
您仍然可以得到这样的印象:这不能在文本编辑器中很好地对齐/显示您的列。编码的选项卡没有错误,但通常您需要调整文本编辑器首选项中的选项卡设置。例如 Geany -> 首选项 -> 编辑器 -> 缩进 -> 制表符宽度为 8 而不是 4。
(后者有点撇开你原来的问题......)