shell - 使用 SED 交换一行中出现的多个单词和数字
问题描述
我有一个大文件,每行都显示:
OCCUPY 12 EVERY PIC 32(12)
OCCUPY 45 EVERY PIC X(21)
OCCUPY 98 EVERY PIC F(A0)
OCCUPY 21 EVERY PIC T(BC)
所需的输出应该是:
PIC 32(12) OCCUPY 12 EVERY
PIC X(21) OCCUPY 45 EVERY
PIC F(A0) OCCUPY 98 EVERY
等等。
所以,这只是一个例子,但在文件中有很多行,PIC 附近有不同的字符/数字,OCCUPY 附近有不同的数字。
到目前为止,我尝试执行:
sed -E 's/(.*OCCUPY\ )(0([A-Z]\([0-9])\)(.*EVERY\ )(.*PIC\ )(([0-9]\([0-9]+\))/\3\4\1\2/'
sed -E 's/((OCCUPY )([A-Z]\([0-9]))\)(.*EVERY )(.*PIC)(([0-9]\([0-9]))/\3\4\1\2/'
但是,它没有帮助。
我将不胜感激任何帮助!
解决方案
从您的示例来看,您的 sed 命令似乎太复杂了。这个更简单的版本怎么样?
sed 's/\(.*\) \(PIC .*\)/\2 \1/'
[更新] 你的台词比你帖子中说的要复杂。它们就像:
MS-MSG OCCUPY 12 EVERY PIC 32(12) 0012345
你想要:
PIC 32(12) OCCUPY 12 EVERY
然后,您所要做的就是将这些额外的字符添加到替换命令的左侧,但在括号之外(其内容用于构建新字符串):
sed 's/.* \(OCCUPY .*\) \(PIC [^ ]*\).*/\2 \1/'
推荐阅读
- java - 禁止程序输入小于 1 的数字(if else / switch)
- java - 调用 super 后抽象类值为 null
- go - golang中括号和花括号的区别
- excel - Excel VBA:用于在工作表中设置动态命名范围的循环
- angular - 从特定区域获取本地时区
- java - 布尔值不适用于 RecyclerView 中的按钮单击
- android - 活动视图与模拟器不同,并且不显示工具栏
- events - 在 UWP 中使用 CompositionTarget.SurfaceContentsLost 事件来管理 RenderTargetBitmap?
- python - 在 python SpeechRecognition 库旁边设置 Snowboy 热门词检测的问题
- javascript - 如何在单个 html 文件中添加灯箱?