Shell-如何使用SED将一行文本分割成片段



我得到了一个命令的输出,它类似于2048,4096,8192,16384,24576,32768

我想把它分成6个不同的文件,但只有数字,而不是逗号初始文本:2048,4096,8192,16384,24576,32768分为:2048到文件A,4096到文件B,8192到文件C等等

该输出遵循以下规则:

  1. 总是有6个空格,用逗号分隔
  2. 数字的长度总是从3到5(我不知道正确的英语单词)
  3. 正如我告诉你的,逗号对我不感兴趣,因为我要用这些数字做数学运算

我试图删除最后的X个数字,但没有找到"检测"逗号的方法,所以操作可以停止。是否可以使用SED?

以下要求在上没有符合POSIX的shell外部的命令(例如您最有可能在Android上使用的busybox ash):

csv=/system/file.csv
IFS=, read a b c d e f <"$csv"
echo "$a" >A
echo "$b" >B
echo "$c" >C
echo "$d" >D
echo "$e" >E
echo "$f" >F

确实假设要写入的文件(ABCDEF)都在当前工作目录内。如果您想在其他地方编写它们,请修改它们的名称,或者使用cd更改到其他目录。

我不确定sed是否是合适的工具。

使用一个简单的Bash脚本:

IFS=',' read -ra val < file.csv
for i in "${val[@]}"; do
   echo $i > file$(( ++j ))
done

它将csv的每个值写入file1file2等:

  • read命令将file.csv中的值分配给数组变量val

  • 使用循环,将每个值写入文件。

只需确保您在当前目录中具有写入权限。如果没有,请更改重定向(例如:> /dirWithWritePermissions/)。

这可能适用于您(GNU sed、bash和并行):

parallel --xapply echo {1} ">>" part{2} :::: <(sed 's/,/n/g' file.csv) ::: {1..6}

这将两个文件"压缩"在一起,必要时重用较短的文件。

注意:在应用此命令之前,请记住删除任何part*文件,否则这些文件将增长(>>会追加)。

declare list_of_files=(fileA fileB fileC fileD fileE)
readarray a <<< $(sed 's/,/n/;{;P;D;}' <<< '2048,4096,8192,16384,24576,32768')
for i in ${a}; do
  echo $i > "${list_of_files["$((num++))"]}"
done

说明:

  • s/,/n/用换行符替换每个逗号
  • {启动命令组
  • P打印模式缓冲区中直到第一个换行符的所有内容
  • D检测模式缓冲区中直到第一个换行符的所有内容,然后重新启动当前命令组
  • }结束命令组

编辑:假设您想将信息复制到/system/file中,但希望每个数字都在自己的行中:

$ sed 's/,/n/;{;P;D;}' < /sys/module/lowmemorykiller/parameters/minfree > /system/file

这将创建一个新的文件/system/file,该文件将包含格式化的输出。

EDIT:更短的是:sed 's/,/n/g',它只需将每个逗号替换为一个新的空格(由末尾的g完成)。

还要注意,虽然sed是一个很好用的工具(你一定喜欢它令人困惑的语言和命令…),但更好更快的方法是使用read中内置的bash。

相关内容

  • 没有找到相关文章

最新更新