我有可预测的管道输入,我想遍历每一行并更改两个字符。字符位置是 19 和 20(每行)。第 19 个字符是逗号,我想将其删除。第 20 个字符是空格,我想将其替换为“x”
775448167763476486, 783834143007506433, 35972, 35972,
775448167763476486, 844395243412914178, 408008, 408008,
775448167763476486, 891964514511355905, 8003, 8003,
783834143007506433, 891655551753846784, 66633, 66633,
应该成为
715448167763476486x783834143007506433, 35972, 35972,
775448167763476486x844395243412911178, 408008, 408008,
705448167763476486x891964513511335905, 8003, 8003,
723834143007506433x891655551753846784, 66633, 66633
如果有更简单的方法可以达到同样的效果,那就更好了。
编辑。
到目前为止,我已经尝试了很多不同的方法
sed
主要..
sed 's/^ *([^,]*) //;s/, \([^,]*\),/\1x,/g'
据我所知,查找逗号的第一个实例很有用,*([^,]*)
我不确定表达式的其余部分在逗号之后如何跟进;
sed 's/, \([^,]*\),/\1x,/g'
我尝试以这种方式修改命令,但发现每行末尾都附加了一个“x”。
sed 's/\(.*\)\(.\{18\}\)\(.*\)/\1x\3/'
同样的问题。我尝试查看另外两个表达式。
sed -E 's/^ *([^,]*) //
sed -e 's/\(.\)$/,\1/'
使用“正则表达式标志‘-e’,但说实话我还不太明白这意味着什么。
cut
cut -c-18 -c21-
当我尝试这个时,我收到的错误是:
cut: only one type of list may be specified Try 'cut --help' for more information.
据我所知,这是用'-c'标志进行的压缩或压缩,我假设错误可能与来自的管道输入有关,sed
但我不确定,必须使用手册页进行研究。
awk
awk '{gsub(/ /, "", $1); gsub(/ /, "x", $2); print}'
我觉得这是一种非常清晰地了解用所需字符替换空格的想法的方式,但对输入没有影响(未改变)。
这就是我在这里发帖的原因,并不是为了寻找答案(如果原始帖子听起来像那样,我很抱歉,我只是尽量简短而切中要点。)真的只是在寻找如何解决这个问题的想法。
给出示例输入的最简单方法是将第一个逗号和空格替换为
x
(此处file
有您的示例):这样做的好处是,无论第一个字段的长度是多少,都可以正常工作。如果必须更改第 19 和第 20 个字符,您可以执行以下操作:
这里的技巧是,意思
/10
是“重复模式的第十次出现”,并且由于模式是..
,所以是两个字符,它将改变第 19 次和第二十次。如果需要分别用“当且仅当它们是和空格时”替换每行的第19和第 20个字符,则可以执行以下操作:
x
,
对于大多数
sed
实现(所有符合 POSIX 2024 的实现),可以通过使用以下命令从基本正则表达式切换到扩展正则表达式来使其更易读-E
:由于
sed
标题或标签中均未包含任何内容,并且输入是可预测的,因此我建议:具有明确的优点,并且字符位置可以作为参数传递给 awk,而无需替换为模式的语法
sed
。使用
GNU awk
:以下命令根据答案使用:
如果输入中没有 TAB 作为字符,那么
cut
可以使用: